SqlBulkCopy错误处理/继续错误

Pal*_*din 10 c# ado.net sqlbulkcopy

我试图将大量数据插入SQL服务器.我的目标表有一个名为"Hash"的唯一索引.

我想用SqlBulkCopy替换我的SqlDataAdapter实现.在SqlDataAapter中有一个名为"ContinueUpdateOnError"的属性,当设置为true时,adapter.Update(table)将插入所有可能的行,并使用RowError属性标记错误行.

问题是我如何使用SqlBulkCopy尽可能快地插入数据,同时跟踪哪些行被插入以及哪些行没有(由于唯一索引)?

以下是其他信息:

  1. 该过程是迭代的,通常按计划重复进行.

  2. 源表和目标表可能很大,有时可能有数百万行.

  3. 即使可以首先检查哈希值,但每行需要两个事务(首先从目标表中选择哈希,然后执行插入).我认为在adapter.update(table)的情况下,检查RowError比检查每行的哈希命中要快.

Sam*_*ron 7

SqlBulkCopy具有非常有限的错误处理功能,默认情况下它甚至不检查约束.

但是,它速度快,真的非常快.

如果要解决重复键问题,并确定批处理中哪些行是重复的.一种选择是:

  • 开始转
  • 在表格上抓一个tablockx选择所有当前的"Hash"值并将它们放入HashSet中.
  • 过滤掉重复项并进行报告.
  • 插入数据
  • commit tran

如果要插入大型集合并且表中初始数据的大小不是太大,则此过程将有效.

您能否请扩展您的问题以包括问题的其余部分.

编辑

现在我在这里有更多的上下文是你可以采取的另一种方式:

  • 将批量插入放入临时表中.
  • 启动serializable tran
  • 选择目标表中已有的所有临时行...报告它们
  • 将临时表中的数据插入到真实表中,在哈希上执行左连接并包括所有新行.
  • 提交tran

这个过程在往返旅行中非常轻松,并且考虑到你的规格应该最终真的很快;