当一次插入失败时,停止SqlBulkCopy回滚事务

时间:2014-06-17 16:10:36

标签: sql-server sqlbulkcopy

我正在使用SqlBulkCopy将批量记录插入服务器。如果一条记录因唯一约束而失败,我不想回滚整批,但我想更新现有记录。

我希望我可以记录失败的记录键值然后在批量插入完成后,返回并单独解决它们。

但是,我无法告诉SqlBulkCopy如何在失败时不回滚事务,也不知道如何获取失败记录的信息。

我可以在将记录添加到SqlBulkCopy DataTable之前检查记录是否存在,但这会增加相当大的开销。

我已经检查了答案here,表明在批量插入后使用临时表和其他一些sproc进行插入/更新,但我认为sproc需要单独处理每个记录以插入新的或更新现有记录 - 非常耗时。

过去4年中有任何其他提示或没有任何改变吗?

2 个答案:

答案 0 :(得分:1)

不要使用SqlBulkCopy。

直接

插入一个临时表(也避免了SqlBulkCopy的可怕锁定行为),然后使用适当的规则将MERGE加入到最终表中。

简单,完成,这就是我所有批量更新的方式。

答案 1 :(得分:1)

我不建议使用merge语句。它有问题首先见Use Caution with SQL Server's MERGE Statement,而且个人恕我直言,我觉得很难遵循并提供一些简单的插入更新声明(不是那么甜的语法糖)。

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。