質問: 私はSqlBulkCopyを使用して、サーバーにレコードのバッチを挿入しています。一意の制約のために1つのレコードが失敗した場合、バッチ全体をロールバックしたくないのですが、代わりに既存のレコードの更新を行いたいと思います。 一度バルク挿入が完了したら、失敗したレコードのキー値をログに記録し、戻って個別にアドレスすることができればと思っていました。 しかし、SqlBulkCopyに失敗したときにトランザクションをロールバックしないように指示する方法や、失敗したレコードの情報を取得する方法を見ることはできません。 レコードをSqlBulkCopy DataTableに追加する前にレコードが存在するかどうかを確認できますが、それはかなりのオーバーヘッドを追加します。 私はここで、ステージングテーブルと他のsprocを使って一括挿入後に挿入/更新を行うことを示す回答を確認しましたが、sprocは各レコードを個別に処理して新しいレコードを挿入するか、既存のレコードを更新する必要があると思います時間がかかる。 過去4年間に他のヒントや何も変わったことはありませんか?
回答: 私はマージステートメントの使用をお勧めしません。 SQL ServerのMERGEステートメントで最初に使用する注意事項を参照してください。多くの個人的なIMHOを参照してください。単純な挿入更新ステートメント(それほど甘いシンタックスシュガーではありません。 ``` INSERT INTO A SELECT * FROM #B B LEFT OUTER JOIN A ON A.ID = B.ID WHERE A.ID IS NULL ``` または ``` UPDATE A SET BLAH = 'BLAH' FROM A INNER JOIN #B B ON B.ID = A.ID ``` 純粋なSQLではなくツールで設定されている場合は、探しているものを処理できるSSISを調べることができます。