【发布时间】:2009-06-17 00:13:34
【问题描述】:
我正在尝试将大量数据插入 SQL 服务器。我的目标表有一个名为“Hash”的唯一索引。
我想用 SqlBulkCopy 替换我的 SqlDataAdapter 实现。在 SqlDataAapter 中有一个名为“ContinueUpdateOnError”的属性,当设置为 true 适配器时。Update(table) 将插入所有可能的行并使用 RowError 属性标记错误行。
问题是如何使用 SqlBulkCopy 尽可能快地插入数据,同时跟踪哪些行被插入,哪些行没有被插入(由于唯一索引)?
这里是附加信息:
该过程是迭代的,通常按计划重复。
源表和目标表可能很大,有时有数百万行。
尽管可以先检查散列值,但每行需要两个事务(首先从目标表中选择散列,然后执行插入)。我认为在 adapter.update(table) 的情况下,检查 RowError 比检查每行的哈希命中要快。
【问题讨论】:
-
为什么不先从要插入的数据集中删除已经存在的行,然后再尝试插入?
-
ChrisW,感谢您的建议。如果您建议我执行此查询“从表中删除 (value1, value2, ..) 中的哈希值。我不能使用这种方法,因为它会将每一行都视为目标表中不存在,但是我系统的其他部分只喜欢处理新记录(没有哈希冲突的记录)。
-
@Paladin,查看扩展答案
标签: c# ado.net sqlbulkcopy