sql >> データベース >  >> RDS >> Sqlserver

UTF-8 フラット ファイルのインポート中に SSIS が改行 {LF} 行区切り文字を認識しないのはなぜですか?

    原因:

    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} を選択 ヘッダー行区切り文字から
    • 最初のデータ行の列名を確認してください
    • をクリックします ページ

    フラット ファイル接続マネージャー エディターのページ 、列区切り文字 は空白で無効になっています。 詳細をクリックします ページ。

    上級 フラット ファイル接続マネージャー エディターのページ 、次のアクションを実行します。

    • 名前を設定します LineData
    • 列区切り文字{LF} に設定されています
    • DataType を設定します Unicode 文字列 [DT_WSTR]
    • OutputColumnWidth を設定します 255 まで
    • プレビューをクリックします ページ。

    プレビュー フラット ファイル接続マネージャー エディターのページ 、表示されたデータが正しいことを確認し、OK をクリックします。 .

    データ ソース Sora が表示されます およびフラット ファイル接続マネージャー ProductListPrice 接続マネージャー パッケージの下部にあるタブ。

    Data Flow Task をドラッグ アンド ドロップします 制御フローに パッケージのタブを開き、ファイルからデータベースへ - Cedilla 区切り記号なし という名前を付けます。

    データ フロー タスクをダブルクリックします。 ビューをデータフローに切り替えます パッケージのタブ。 フラット ファイル ソースをドラッグ アンド ドロップします。 データフロー タブ。 フラット ファイル ソースをダブルクリックします。 フラット ファイル ソース エディタを開く .

    接続マネージャー フラット ファイル ソース エディタのページ 、フラット ファイル接続マネージャーを選択します 製品リスト価格 をクリックします ページ。

    フラット ファイル ソース エディタのページ 、列 LineData を確認します OKをクリックします .

    スクリプト コンポーネントをドラッグ アンド ドロップします データ フローフラット ファイル ソースの下のタブ 、変換を選択します OKをクリックします . フラット ファイル ソースから緑色の矢印を接続します スクリプト コンポーネントへ . スクリプト コンポーネントをダブルクリックします スクリプト変換エディタを開く .

    入力列をクリックします スクリプト変換エディター LineData を選択します 桁。 入力と出力をクリックします ページ。

    入力と出力について スクリプト変換エディタのページ 、次のアクションを実行します。

    • 入力名を FlatFileInput に変更
    • 出力名を SplitDataOutput に変更します
    • 出力列を選択 列を追加をクリックします .これをもう一度繰り返して、別の列を追加します。
    • 最初の列に ProductId という名前を付けます
    • DataType を設定します 列 ProductIdUnicode 文字列 [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}
    • 列区切りフィールドが無効になっている可能性があります。 列をリセットをクリックします
    • 列の区切り記号を設定する Ç
    • 詳細をクリックします ページ

    上級 フラット ファイル接続マネージャー エディターのページ 、次のアクションを実行します:

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



    1. PLSQLを使用してファイルをあるディレクトリから別のディレクトリに移動する方法

    2. 関数UNIX_TIMESTAMPは存在しません

    3. 任意のOracleセッションが使用しているトランザクション分離レベルをどのように確認できますか

    4. SQL ServerでIDENTITY()プロパティを使用する方法