我正在使用SqlBulkCopy将批量记录插入服务器。如果一条记录因唯一约束而失败,我不想回滚整批,但我想更新现有记录。
我希望我可以记录失败的记录键值然后在批量插入完成后,返回并单独解决它们。
但是,我无法告诉SqlBulkCopy如何在失败时不回滚事务,也不知道如何获取失败记录的信息。
我可以在将记录添加到SqlBulkCopy DataTable之前检查记录是否存在,但这会增加相当大的开销。
我已经检查了答案here,表明在批量插入后使用临时表和其他一些sproc进行插入/更新,但我认为sproc需要单独处理每个记录以插入新的或更新现有记录 - 非常耗时。
过去4年中有任何其他提示或没有任何改变吗?
答案 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。