1

SqlBulkCopyを使用して変換を行っています。現在、クラスのIListコレクションがあり、基本的にSqlBulkCopyで使用するためにDataTableに変換できます。

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

説明させてください..ここに3つのレコードがあります

ID      Name         Address
1       Scott        London
1       Mark         London
1                    Manchester

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

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

ID      Name      Address
1       Mark      Manchester

どうすればこれを行うことができますか?私は途方に暮れています。

ありがとう。

編集

少し更新します。SQLbulkCopyを使用する前に、レコードを管理およびマージします。何が成功し、何が失敗したかのリストを取得することは可能ですか...それともALLの場合ですか、それとも何もありませんか?SQLbulkCopyに代わるものは他にないと思いますが、更新を行う以外にありませんか?

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

4

2 に答える 2

0

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

データを挿入する前に、データを修正する必要があります。これが既存の行への更新があることを意味する場合、キーの競合が発生するため、それらを挿入することはできません。

一時テーブルに一括挿入して適切な挿入または更新ステートメントを実行するか、新しい行のみを挿入して残りの行に対して更新ステートメントを発行するか、既存の行をフェッチしてデータを修正してから再挿入する前に削除することができます。

ただし、既存の行を更新するように一括コピーを説得する方法はありません。

于 2010-11-25T12:17:22.633 に答える
0

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 */
}

DataTable次に、必要なデータが得られSqlBulkCopyたらにを渡します。


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

于 2010-11-25T12:20:39.230 に答える