プライマリキーがない場合、SqlBulkCopyで重複するレコードを挿入しないようにする方法

c# sql sqlbulkcopy sql-server sql-server-2008

質問

何千ものレコードを含む毎日のXMLファイルを受け取ります。それぞれのファイルは、レポートや課金に使用するために内部データベースに保存する必要があるビジネストランザクションです。私は、毎日のファイルには一意のレコードのみが含まれていたとの印象を受けましたが、私のユニークな定義はプロバイダのものとまったく同じではないことがわかりました。

このデータをインポートする現在のアプリケーションはC#.Net 3.5コンソールアプリケーションです.SqlBulkCopyを使用してMS SQL Server 2008データベーステーブルに格納します。ここで、列はXMLレコードの構造と正確に一致します。各レコードには100個を超えるフィールドがあり、データには自然なキーがありません。あるいは、複合キーがヌルを許可しなければならないため、フィールドを作成することができます。現在、この表には複数の索引がありますが、主キーはありません。

基本的には、行全体が一意である必要があります。 1つのフィールドが異なる場合、それは挿入するのに十分有効です。私は行全体のMD5ハッシュを作成し、それをデータベースに挿入し、SqlBulkCopyが行を挿入するのを防ぐために制約を使用してみましたが、MD5ハッシュをBulkCopy操作に取得する方法がわかりません。いずれかのレコードが失敗した場合や、それが継続する場合は、全体の操作が失敗してロールバックされるかどうかを確認してください。

このファイルには非常に多くのレコードが含まれています。これはXMLの行ごとに行なわれ、すべてのフィールドに一致するレコードをデータベースに照会し、挿入を決定するのは実際にこれを行うことができる唯一の方法です。私は、アプリケーションを完全に書き直す必要がないことを望んでいました。一括コピー操作は非常に高速です。

プライマリキーなしで重複行を防止しながらSqlBulkCopyを使用する方法を知っている人はいますか?これを行う別の方法の提案ですか?

受け入れられた回答

私はステージングテーブルにデータをアップロードしてから、最終的なテーブルへの複写の後に複写を処理します。

たとえば、ステージングテーブルに(一意でない)インデックスを作成して、「キー」を処理することができます。


エキスパート回答

データボリュームとは何ですか?あなたは私が見ることができる2つのオプションがあります:

1:独自のIDataReaderを実装し、データにハッシュを使用し、重複をスキップしてTDSに渡されないようにして、ソースでフィルタリングします。

2:DBにフィルタリングします。最も単純なレベルでは、インポートの複数の段階(未処理の未処理データ)を持つことができ、 DISTINCTデータを実際の表にコピーすることができます。これにはCHECKSUMを使用することもできます 、それは依存しています。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ