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

或过滤第一个col1per pkcol

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 回答