同じIDを持つ3つのレコードがSqlBulkCopyを使用して異なる列を変更する

bulkinsert c# primary-key sqlbulkcopy

質問

私はSqlBulkCopyで変換を行っています。私は現在、基本的に私はSqlBulkCopyで使用するためにDataTableへの変換を行うことができるクラスのIListのコレクションを持っています。

問題は、私は同じIDを持つ3つのレコードを持つことができるということです。

ここでは3つのレコードがあります

ID      Name         Address
1       Scott        London
1       Mark         London
1                    Manchester

基本的には、私はそれらを順番に挿入する必要があります..したがって、レコード1が存在しない場合は、次のレコードが存在する場合は挿入レコードではなく、新しい1を挿入する(IDはまだ1です) 2番目のレコードの場合は、ID 1の名前と住所の両方の列を置き換えます。

最後に3番目のレコードではNameが存在しないが、ID 1とmanchesterというアドレスがあるので、レコードを更新する必要があるので名前を変更するのではなく、マンチェスターを更新する必要があることに気付く。したがって、3番目のレコードはid1 =

ID      Name      Address
1       Mark      Manchester

どのように私はこれを行うことができます任意のアイデア?私は迷っている。

ありがとう。

EDIT

さて、少し更新。 SQLbulkCopyを使用する前に、レコードを管理してマージします。何が成功し、何が失敗したのかを知ることは可能でしょうか...それともそれとも何もないのでしょうか?私は、SQLbulkCopyに代わるものはないと思っていますが、更新を行うには?

すべてを挿入でき、失敗したものが一時テーブルに挿入されることが理想的です...したがって、私は失敗したテーブルのものを訂正することについて心配する必要があります。

受け入れられた回答

あなたはにそのデータを処理する必要があるためDataTable (カスタム書いている場合を除き、とにかく IDataReader )、あなたがそれらを与える前にレコードをマージする必要がありSqlBulkCopy 。例えば(擬似コードで):

/* create empty data-table */
foreach(row in list) {
    var row = /* try to get exsiting row from data-table based on id */
    if(row == null) { row = /* create and append row to data-table */ }
    else { merge non-trivial properties into existing row */
}

必要なデータを取得したら、 DataTableSqlBulkCopy渡しDataTable


編集し直してください。そのシナリオでは、ステージングテーブル(通常はアップロードされたデータのようなスキーマを持つ通常のテーブルですが、通常は外部キーなどはありません)にアップロードし、通常のTSQLを使用してデータをトランザクションテーブルに移動します。完全なTSQLサポートに加えて、これにより、より良い操作のロギングも可能になります。特に、複雑な一括操作を助けることができるINSERTOUTPUT節を見てください。


人気のある回答

一括コピー(一括挿入)での更新はできません。挿入のみです。したがって、名前。

データを挿入する前に修正する必要があります。既存の行が更新されている場合は、キー競合を生成する行を挿入することはできません。

テンポラリ・テーブルに一括挿入し、適切な挿入または更新文を実行するか、新しい行を挿入して残りの更新文を発行するか、またはそれらをフェッチして再挿入する前に既存の行を削除することができます。

しかし、一括コピーを説得して既存の行を更新する方法はありません。



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