原因:
SSIS はファイルの読み取りに失敗し、列区切り文字 Ç
が原因で以下の警告を表示します ("c" とセディーユ ) および not
行区切り記号 {LF}
のため (改行 ).
[Read flat file [1]] 警告:ヘッダー行の読み取り中にデータ ファイルの終わりに達しました。ヘッダー行の区切り記号とスキップするヘッダー行の数が正しいことを確認してください。
プレ>
Script Component
を使用して問題を解決する方法を示す SSIS パッケージのサンプルを次に示します。 最後に、問題をシミュレートする別の例があります。解決策:
以下のサンプルパッケージは
SSIS 2008 R2
で書かれています .行区切り文字{LF}
を含むフラット ファイルを読み取ります 単一の列の値として。次に、スクリプト コンポーネント
を使用してデータを分割しますSQL Server 2008 R2
のテーブルに情報を挿入するには データベース。Notepad++ を使用します 行数の少ない単純なフラット ファイルを作成します。以下のサンプル ファイルには Product Id があります と定価
Ç
で区切られた各行の情報 列の区切り記号として使用され、各行は{LF}
で終了します
Notepad++ で、
Encoding
をクリックします。 次に、UTF-8 でのエンコード
をクリックします。 フラットファイルをUTF-8
で保存するには エンコーディング。
サンプルは
SQL Server 2008 R2
を使用しますSora
という名前のデータベース .dbo.ProductListPrice
という名前の新しいテーブルを作成します 以下のスクリプトを使用します。 SSIS はフラット ファイル データをこのテーブルに挿入します。USE Sora;GOCREATE TABLE dbo.ProductListPrice( ProductId nvarchar(30) NOT NULL , ListPrice numeric(12,2) NOT NULL);GO
プレ>Business Intelligence Development Studio (BIDS) 2008 R2 を使用して SSIS パッケージを作成する .パッケージに
SO_6268205.dtsx
という名前を付けます .Sora.ds
という名前のデータ ソースを作成します。 データベースに接続するSora
SQL Server 2008 R2 で .パッケージ内の任意の場所を右クリックし、
変数
をクリックします。 をクリックして変数ペインを表示します。ColumnDelimiter
という名前の新しい変数を作成します データ型String
の パッケージ スコープ内SO_6268205
変数に値Ç
を設定します
接続マネージャー
を右クリックします。新しいフラット ファイル接続...
をクリックします。 フラット ファイルを読み取るための接続を作成します。
全般
フラット ファイル接続マネージャー エディターのページ 、次のアクションを実行します:
- 設定接続マネージャ名
ProductListPrice
に - 設定説明
製品の定価情報を読み取るためのフラット ファイル接続マネージャー
。 - フラット ファイル パスを選択します。パス
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
にファイルがあります {LF}
を選択 ヘッダー行区切り文字から最初のデータ行の列名
を確認してください列
をクリックします ページ
列
フラット ファイル接続マネージャー エディターのページ 、列区切り文字
は空白で無効になっています。 詳細code>をクリックします
ページ。
上級
フラット ファイル接続マネージャー エディターのページ 、次のアクションを実行します。
- 名前を設定します
LineData
に - 列区切り文字が
{LF}
に設定されています - DataType を設定します
Unicode 文字列 [DT_WSTR]
へ - OutputColumnWidth を設定します
255
まで プレビュー
をクリックします ページ。
プレビュー
フラット ファイル接続マネージャー エディターのページ 、表示されたデータが正しいことを確認し、OK
をクリックします。 .
データ ソース Sora が表示されます およびフラット ファイル接続マネージャー ProductListPrice 接続マネージャー
パッケージの下部にあるタブ。
Data Flow Task
をドラッグ アンド ドロップします 制御フローに パッケージのタブを開き、ファイルからデータベースへ - Cedilla 区切り記号なし
という名前を付けます。
データ フロー タスクをダブルクリックします。 ビューをデータフロー
に切り替えます パッケージのタブ。 フラット ファイル ソース
をドラッグ アンド ドロップします。 データフロー タブ。 フラット ファイル ソースをダブルクリックします。 フラット ファイル ソース エディタ
を開く .
接続マネージャー
フラット ファイル ソース エディタのページ 、フラット ファイル接続マネージャーを選択します 製品リスト価格
列をクリックします ページ。
列
フラット ファイル ソース エディタのページ 、列 LineData
を確認します OK
をクリックします .
スクリプト コンポーネント
をドラッグ アンド ドロップします データ フローに フラット ファイル ソースの下のタブ 、変換
を選択します OK
をクリックします . フラット ファイル ソースから緑色の矢印を接続します スクリプト コンポーネントへ . スクリプト コンポーネントをダブルクリックします スクリプト変換エディタ
を開く .
入力列をクリックします スクリプト変換エディター LineData
を選択します 桁。 入力と出力をクリックします ページ。
入力と出力
について スクリプト変換エディタのページ 、次のアクションを実行します。
- 入力名を FlatFileInput に変更
- 出力名を
SplitDataOutput
に変更します - 出力列を選択
列を追加
をクリックします .これをもう一度繰り返して、別の列を追加します。 - 最初の列に
ProductId
という名前を付けます - DataType を設定します 列 ProductId の
Unicode 文字列 [DT_WSTR]
へ - 長さを設定します
30
まで
入力と出力
について スクリプト変換エディタのページ 、次のアクションを実行します。
- 2 番目の列に
ListPrice
という名前を付けます - DataType を設定します 列 ListPrice の
数値 [DT_NUMERIC]
に - 精度を設定します
12
まで - スケールを設定します
2
へ - スクリプトをクリックします スクリプトを変更するページ
スクリプト
について スクリプト変換エディタのページ 、次のアクションを実行します。
- ReadOnlyVariables の省略記号ボタンをクリックします 変数
User::ColumnDelimiter
を選択します スクリプトの編集...
をクリックします。
以下の C# をスクリプト エディターに貼り付けます。スクリプトは次のタスクを実行します。
- 列区切り値
Ç
の使用 変数 User::ColumnDelimiter で定義 、メソッドFlatFileInput_ProcessInputRow
入力値を分割し、スクリプト コンポーネント変換で定義された 2 つの出力列に割り当てます。
C# のスクリプト コンポーネント コード
using System;using System.Data;using Microsoft.SqlServer.Dts.Pipeline.Wrapper;using Microsoft.SqlServer.Dts.Runtime.Wrapper;[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]public class ScriptMain :UserComponent{ public override void PreExecute() { base.PreExecute(); } public override void PostExecute() { base.PostExecute(); public override void FlatFileInput_ProcessInputRow(FlatFileInputBuffer Row) { const int COL_PRODUCT =0; } const int COL_PRICE =1; char delimiter =Convert.ToChar(this.Variables.ColumnDelimiter); string[] lineData =Row.LineData.ToString().Split(区切り文字); Row.ProductId =String.IsNullOrEmpty(lineData[COL_PRODUCT]) ? String.Empty :lineData[COL_PRODUCT]; Row.ListPrice =String.IsNullOrEmpty(lineData[COL_PRICE]) ? 0 :Convert.ToDecimal(lineData[COL_PRICE]); }}コード> プレ>
OLE DB Destination
をドラッグ アンド ドロップします データ フローに タブ。緑の矢印を スクリプト コンポーネント から接続します OLE DB 宛先へ . OLE DB 宛先 をダブルクリックします OLE DB Destination Editor
を開く .
接続マネージャー
OLE DB Destination Editor のページ 、次のアクションを実行します。
ソラ
を選択 OLE DB 接続マネージャー から
テーブルまたはビュー - 高速読み込み
を選択します データ アクセス モードから
[dbo].[ProductListPrice]
を選択します from テーブルまたはビューの名前
- マッピングをクリックします ページ
マッピング
をクリックします OLE DB Destination Editor のページ 入力と出力の列名が同じ場合、列は自動的にマップされます。 OK
をクリックします .
データ フロー すべてのコンポーネントを構成すると、タブは次のようになります。
クエリ select * from dbo.ProductListPrice
を実行します SQL Server Management Studio (SSMS) で テーブル内の行数を見つける。パッケージを実行する前に空にする必要があります。
パッケージを実行します。パッケージが正常に処理されたことがわかります 9 行。フラット ファイルには 10 が含まれています 行ですが、最初の行は列名を含むヘッダーです。
クエリ select * from dbo.ProductListPrice
を実行します SQL Server Management Studio (SSMS) で 9 を見つける 行がテーブルに正常に挿入されました。データはフラット ファイル データと一致する必要があります。
上記の例は、スクリプト コンポーネントを使用してデータを手動で分割する方法を示しています。 フラット ファイル接続マネージャー 列区切り文字 Ç
を構成するとエラーが発生します
問題のシミュレーション:
この例は、個別の フラット ファイル接続マネージャー を示しています 列区切り文字 Ç
で構成 、実行されますが、警告が発生し、行は処理されません。
接続マネージャー
を右クリックします。 新しいフラット ファイル接続...
をクリックします。 フラットファイルを読み取るための接続を作成します。 全般
フラット ファイル接続マネージャー エディターのページ 、次のアクションを実行します:
- 設定接続マネージャ名
ProductListPrice_Cedilla
に
- 説明を
Cedilla 列区切り記号付きのフラット ファイル接続マネージャー
に設定します。
- パス
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
にファイルがあります フラット ファイル パスを選択します。
{LF}
を選択 ヘッダー行区切り文字から
最初のデータ行の列名
を確認してください
列
をクリックします ページ
列
フラット ファイル接続マネージャー エディターのページ 、次のアクションを実行します:
- 行区切り文字を設定
{LF}
へ
- 列区切りフィールドが無効になっている可能性があります。
列をリセット
をクリックします
- 列の区切り記号を設定する
Ç
へ
詳細code>をクリックします
ページ
上級
フラット ファイル接続マネージャー エディターのページ 、次のアクションを実行します:
- 名前を設定します
ProductId
に
- ColumnDelimiter を設定します
Ç
へ
- DataType を設定します
Unicode 文字列 [DT_WSTR]
へ
- 長さを設定します
30
まで
- 列
ListPrice
をクリックします
上級
フラット ファイル接続マネージャー エディターのページ 、次のアクションを実行します:
- 名前を設定します
ListPrice
に
- ColumnDelimiter を設定します
{LF}
へ
- DataType を設定します
数値 [DT_NUMERIC]
に
- DataPrecision を設定します
12
まで
- DataScale を設定します
2
へ
OK
をクリックします
データ フロー タスク
をドラッグ アンド ドロップします。 制御フローに タブを開き、ファイルからデータベースへ - Cedilla 区切り記号付き
のように名前を付けます .最初のデータ フロー タスクを無効にします。
フラット ファイル ソース
で 2 番目のデータ フロー タスクを構成します。 および OLE DB Destination
Flat File Source をダブルクリックして Flat File Source Editor
を開きます。 . 接続マネージャー
フラット ファイル ソース エディタのページ 、フラット ファイル接続マネージャーを選択します ProductListPrice_Cedilla
列をクリックします ページで列を構成します。 OK
をクリックします .
パッケージを実行します。すべてのコンポーネントが緑色で表示され、プロセスが成功したことを示しますが、行は処理されません。 フラット ファイル ソース
の間に行番号の表示がないことがわかります。 および OLE DB Destination
進行状況
をクリックします タブをクリックすると、次の警告メッセージが表示されます。
[Read flat file [1]] 警告:ヘッダー行の読み取り中にデータ ファイルの終わりに達しました。ヘッダー行の区切り記号とスキップするヘッダー行の数が正しいことを確認してください。
プレ>