2011-12-20 11 views
2

私はそれぞれ約100〜200MBの約20の.csvファイルを持っています。バルク挿入方法100 100MBのCSVファイルをSQL Serverに挿入する

それぞれ約100列あります。

各ファイルの列の90%は同じです。ただし、ファイルの中には列が多く、ファイルの中には列が少ないものがあります。

これらのファイルをすべてSQL Server 2008データベースの1つのテーブルにインポートする必要があります。

フィールドが存在しない場合は、フィールドを作成する必要があります。

質問:このインポートではどのような処理が必要ですか?これらのファイルをすべてデータベースの1つのテーブルに効率的かつ迅速にインポートするにはどうしたら、フィールドが存在しない場合は作成されますか?同じフィールドが別の場所にある可能性がありますのでご注意ください。たとえば、CARはフィールドABの1つのcsvにありますが、同じフィールド名(CAR)は他のcsvファイルのACになります。ソリューションは、SQLまたはC#またはその両方にすることができます。

+3

SSISパッケージを使用してください。 – Maess

+0

これは進行中のことでしょうか?または一度のインポート? –

+0

@johnこれは1回になります –

答えて

3

あなたは多くのオプションを選択することも 1. DTSパッケージには 3.バルクにすべてのファイルを挿入する挿入し、1人の制服のCSVファイルを生成し、その列とバルクと同期してdbテーブルを取得する 2.トライ独自のテーブルを作成し、その後にテーブルをターゲットテーブルにマージします。 System.Data.SqlClientの

+0

私はあなたの提案#3が大好きです。 3つのテーブルをどのように組み合わせるか教えていただけますか? –

+0

もちろん - 手動で –

+1

私もあなたの#3 +1好きです@ – Bengie

3

私は、SQL Serverに付属し、ちょうどこのような仕事を支援することを目的とBCPプログラムを見てお勧めします:あなたはどのCSVを指定することができます「形式のファイルは、」あり

http://msdn.microsoft.com/en-us/library/aa337544.aspx

列はどのSQL列に移動します。

あなたは、C#のを使用することがより傾斜しているSqlBulkCopyクラスを見ている場合:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

また、このを見てみましょSOまた、SQL ServerにCSVファイルからのインポートについては、スレッド:

SQL Bulk import from CSV

1

私は、CSVファイルのヘッダーと各店舗に必要な列の辞書を読み取り、いずれかの「レコード生成を出力し、小さなC#アプリケーションを書いてお勧めしますeテーブル」ステートメントを実行するか、データベース上でテーブル作成操作を直接実行します。その後、Sql Management Studioを使用して、インポートルーチンを使用して20個のファイルを個別に読み込むことができます。

1

使用SqlBulkCopyクラスこれは、大量のデータ転送を容易にします。 DataTime DBのカラムでは動作しません。

1

ここにはいくつかの可能性があります。

  • 利用可能な場合は、SSISを使用できます。あなたは全体の.csvファイル を挿入し、それが属するそれぞれの行を置くか、作成することで、おそらくMERGE文で をストアドプロシージャを使用するステージング表に一括挿入にSqlBulkCopyを使用することができますSQL Serverでは
  • 新しいものがなければ が存在します。
  • あなたはファイルの読み取りとSqlBulkInsertを使用してそれらを書くか、方向の答えとよりのEntityDataReader
1

以下にC#のコードを使用しますが、ここで私は行くことができます。私がやる方法は、最初にCSVファイルとDBの両方から列名を列挙してから、CSVのものがすべて出力先に存在することを確認します。

すべての列を検証したり作成したりすると、バルク挿入を実行できます。同時に複数のインポートが行われていないと仮定すると、インポートを開始するときにDBからカラム名を変更する必要がないので、カラム名をキャッシュすることができます。

複数のインポートが同時に実行される場合、競合状態が表示される可能性があるため、インポート中に完全なテーブルロックがあることを確認する必要があります。

私はSQLデータベースの自動インポートをたくさん行っています。DBに入ってくるデータを知っていることを前提としているので、あなたが尋ねたものは見たことがありません。あらかじめ列を知っていないのは、通常非常に悪いことですが、ルールの例外があるように思えます。

+1

私は財政においてこの厳密なケースを見てきました。私は全く驚いていない。しかし、はい、それは迷惑で/厄介です。 –

0

これらのデータボリュームについては、ETLを使用する必要があります。 See this tutorial

のETLは、データ操作の大量

+0

なぜdownvote ...素早いコメントが助けることができるか知っていいですか? – Romias

1

ロールあなた自身のために設計されています。

データベース内のターゲットテーブルの列のランタイム表現を保持(または作成)します。各ファイルをインポートする前に、列がすでに存在するかどうかを確認してください。そうでない場合は、適切なALTER文を実行します。次に、ファイルをインポートします。

実際のインポートプロセスは、BCPなど、使用可能なバルクプロトコルで行う必要があります。ソースデータと出力先は物理的にではなく、論理的にしか整列しないので、ファンキーなカジギングを行う必要があります。したがって、BCP形式のファイルが必要になります。

関連する問題