4

SQLBulkCopyを使用するときに主キー違反エラーに対処するための最良の方法は何ですか

Violation of PRIMARY KEY constraint 'email_k__'. Cannot insert duplicate key in object  'lntmuser.email'.

(つまり、行が宛先テーブルにすでに存在する場合)?

重複する行の挿入をスキップする方法はありますか、それとも事前に確認して処理する必要がありますか?

現在使用しているコードは次のとおりです。

  var conPro = tx_ProConStr.Text;
  var conArc = tx_ArcConStr.Text;

  var con = new SqlConnection {ConnectionString = conPro};
  var cmd = new SqlCommand("SELECT * FROM dbo.email", con);
  con.Open();

  var rdr = cmd.ExecuteReader(); 
  var sbc = new SqlBulkCopy(conArc) {DestinationTableName = "dbo.email"};

  sbc.WriteToServer(rdr);

  sbc.Close();
  rdr.Close();
  con.Close();
4

2 に答える 2

6

通常、一時テーブルへの一括コピー操作を実行してから、通常の SQL を使用してそこからターゲット テーブルにデータをコピーします。これにより、「一括更新」を実行できるだけでなく、このような特別な状況にも対処できます (ただし、この特定の必要性には遭遇していません)。

直接の一括コピーに比べてパフォーマンスが低下しますが、INSERT を実行するよりもはるかに高速です。

于 2012-05-21T20:24:57.070 に答える
1

重複を除外するようにソース クエリを調整できます。例えば:

select distinct * from dbo.email

または、次のように最初のフィルターを適用するにcol1pkcol:

select  *
from    (
        select  row_number() over (parition by pkcol order by col1) as rn
        from    dbo.email
        ) as SubQueryAlias
where   rn = 1
于 2012-05-21T20:41:13.833 に答える