原因:
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という名前のデータ ソースを作成します。 データベースに接続するSoraSQL 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]] 警告:ヘッダー行の読み取り中にデータ ファイルの終わりに達しました。ヘッダー行の区切り記号とスキップするヘッダー行の数が正しいことを確認してください。 プレ>



