質問: 何千ものレコードを含む毎日のXMLファイルを受け取ります。それぞれのファイルは、レポートや課金に使用するために内部データベースに保存する必要があるビジネストランザクションです。私は、毎日のファイルには一意のレコードのみが含まれていたとの印象を受けましたが、私のユニークな定義はプロバイダのものとまったく同じではないことがわかりました。 このデータをインポートする現在のアプリケーションはC#.Net 3.5コンソールアプリケーションです.SqlBulkCopyを使用してMS SQL Server 2008データベーステーブルに格納します。ここで、列はXMLレコードの構造と正確に一致します。各レコードには100個を超えるフィールドがあり、データには自然なキーがありません。あるいは、複合キーがヌルを許可しなければならないため、フィールドを作成することができます。現在、この表には複数の索引がありますが、主キーはありません。 基本的には、行全体が一意である必要があります。 1つのフィールドが異なる場合、それは挿入するのに十分有効です。私は行全体のMD5ハッシュを作成し、それをデータベースに挿入し、SqlBulkCopyが行を挿入するのを防ぐために制約を使用してみましたが、MD5ハッシュをBulkCopy操作に取得する方法がわかりません。いずれかのレコードが失敗した場合や、それが継続する場合は、全体の操作が失敗してロールバックされるかどうかを確認してください。 このファイルには非常に多くのレコードが含まれています。これはXMLの行ごとに行なわれ、すべてのフィールドに一致するレコードをデータベースに照会し、挿入を決定するのは実際にこれを行うことができる唯一の方法です。私は、アプリケーションを完全に書き直す必要がないことを望んでいました。一括コピー操作は非常に高速です。 プライマリキーなしで重複行を防止しながらSqlBulkCopyを使用する方法を知っている人はいますか?これを行う別の方法の提案ですか?
回答: 私はステージングテーブルにデータをアップロードしてから、最終的なテーブルへの複写の後に複写を処理します。 たとえば、ステージングテーブルに(一意でない)インデックスを作成して、「キー」を処理することができます。