2011-06-19 12 views
11

多くの行(Entity Frameworkオブジェクトから構築)をSQL Serverに挿入します。問題は、一部の文字列プロパティの長さがデータベースの列の長さを超えているために例外が発生し、すべての行がデータベースに挿入できなくなることです。バルク挿入時に文字列を自動的に切り捨てる方法は?

SqlBulkCopyに長すぎる行を自動的に切り捨てるように指示する方法があるのだろうか?もちろん、DataTableに挿入する前に、限られた長さを超えた場合は、各プロパティをチェックして部分文字列を取りますが、プログラム全体が遅くなります。

答えて

7

残念なことに、SqlBulkCopyでこれを行うの方法は、です。 SQL Bulk Insertは、本質的にはほとんど「ダム」ですが、その理由は非常に高速です。彼らはログに記録されていません(SqlRowsCopiedのイベントをキャプチャする場合を除く)。何かが失敗した場合、多くの情報はありません。あなたが方法で、カウンターこのクラス

の目的になります探しているしかし、2つの可能な方法があることができるか:

  • あなたは(SqlBulkCopy() Constructorに渡された)SqlBulkCopyOptions列挙を使用して試すことができますし、 SqlBulkCopyOptions.CheckConstraints(データの挿入中に制約をチェックします。デフォルトでは、制約はチェックされません)。

  • それとも、(指定した場合は、挿入を発射するために、サーバーがデータベースに挿入された行のトリガが発生します。)SqlBulkCopyOptions.FireTriggers列挙を使用して、SQL ServerのInsert Triggerで例外を処理することができます。

+1

-1トリガーが遅すぎる:トランケーションが発生するコードが実行される前にチェックでも例外が発生します。 Opは彼らが始まった場所に戻っています。 – gbn

+1

+0.5? INSTEAD OF INSERTトリガーを使用すると、挿入するデータをトリムすることができますが、ステージングテーブルはより良いパスです。 – SqlACID

9

一括処理には必ずステージング/ロードテーブルを使用してください。

次に、実際のテーブルにフラッシュする前に、データを処理、クリーニング、スクラブなどができます。

  1. がロードINSERT realtable (..) SELECT LEFT(..), .. FROM Staging
-1
を使用して "本物" の表をステージングから 広い
  • フラッシュとステージング表を:これは、だから、レフト、検索、デ重複など

    を含み

    SQLBulkCopyクラスを使用しているときにSQLTransactionクラスを使用しようとする

  • 関連する問題