2

このトピックに関する他のスレッドがあることは知っていますが、それらは私のニーズほど具体的ではありません (これまでのところ見つけることができます)。

管理している SQL Server データベースにインポートするための csv ファイルがあります。それらは人間によってまとめられているため、列が多すぎる、データ型が正しくない、ヘッダーが破損しているなどのエラーが発生する可能性があります。

ユーザーからサーバー上のディレクトリにファイルを受信できるWebフォームがあり、行を文字列として読み取り、セルごとに解析し、正しいセル数が存在するかどうかを確認してから、次の行に移動します.

次に、データ型と範囲を検証しますが、これは最善の方法ではありません。数値型の手動範囲チェックなどを行うのは、少し古風に思えます。

より良い方法はありますか?いくつかのこと。

  1. 「数値」だけでなく、nvarchar のような SQL Server 型もあります。

  2. ファイルは、数キロバイトの小ささから、ギガバイトを超える大きさまで可能です。

  3. 行 x が失敗しただけでなく、エラーが存在する特定の行と列をそれぞれ報告する必要があります。

セル値を期待される型に変換/キャストし、例外をキャッチし、データをチャンクに分割し、スレッドを生成して並行してチェックを実行しようとしているのではないかと思いましたか?

前もって感謝します。

4

1 に答える 1

1

バルクコピーを使用することをお勧めします。SSISははるかに複雑で、エラーが発生しやすくなります(通常の状況では、はるかに遅くなります...)。

通常、どの列を期待するかがわかっており、正しい形式のインポートされたデータの「インポートステージテーブル」を作成する必要があります。TSQLの最小要件(列数)に適合しない場合は、ファイル全体を拒否できます(bulc挿入の周りに「try / catch」を使用)。

変換とタイプチェックは、最初のインポート後に実行できます。このため、ステージテーブルに正しい形式の追加の列があると便利な場合があります。たとえば、nvarchar列にインポートして、10進値に変換できます。ここでの秘訣は、ビューを使用することです。ビューの下の例では、「myImportTable_InsertView」はステージテーブルからインポートされた列のみを選択します(ステージテーブルにはタイプチェック用の列がさらにあります)

    DECLARE @SQLString nvarchar(4000) =

    INSERT dbo.myImportTable_InsertView
    FROM ''' + @FullFilename + ''' WITH
    (
    FIELDTERMINATOR = '';'',
    ROWTERMINATOR = ''\n'',
    CODEPAGE= ''RAW''
    )'
    Exec (@SQLString)

すべての検証が完了したら、ステージテーブルから最終的な宛先にデータをコピーするだけです。

エラーのある行を報告するために、私は通常、ステージテーブルの行にフラグを使用してさまざまな種類のエラーをマークします。

于 2013-02-20T10:18:08.540 に答える