我试图将大量数据插入SQL服务器。我的目标表有一个名为“Hash”的唯一索引。
我想用SqlBulkCopy替换我的SqlDataAdapter实现。在SqlDataAapter中有一个名为“ContinueUpdateOnError”的属性,当设置为true时,adapter.Update(table)将插入所有可能的行,并使用RowError属性标记错误行。
问题是我如何使用SqlBulkCopy尽可能快地插入数据,同时跟踪哪些行被插入以及哪些行没有(由于唯一索引)?
以下是其他信息:
该过程是迭代的,通常按计划重复进行。
源表和目标表可能很大,有时可能有数百万行。
尽管可以先检查哈希值,但每行需要两个事务(首先从目标表中选择哈希,然后执行插入)。我认为在adapter.update(table)的情况下,检查RowError比检查每行的哈希命中要快。
答案 0 :(得分:7)
SqlBulkCopy,具有非常有限的错误处理功能,默认情况下它甚至不检查约束。
然而,它速度快,真的非常快。如果要解决重复键问题,请确定批处理中哪些行是重复的。一种选择是:
如果要插入大量集合并且表格中初始数据的大小不是太大,此过程将有效。
请您扩展您的问题以包含问题的其余部分。
修改强>
现在我在这里有更多的背景是你可以采取的另一种方式:
在往返过程中,这个过程非常轻松,并且考虑到你的规格应该最终真的很快;
答案 1 :(得分:4)
与已经建议的方法略有不同;执行SqlBulkCopy
并捕获 SqlException 抛出:
Violation of PRIMARY KEY constraint 'PK_MyPK'. Cannot insert duplicate
key in object 'dbo.MyTable'. **The duplicate key value is (17)**.
然后,您可以从ID 17中删除源中的所有项目,这是第一个重复的记录。我在这里做出的假设适用于我的情况,可能不适合你的情况;即复制是由上传期间由于SQL /网络错误导致的先前失败的SqlBulkCopy
的完全相同数据引起的。
答案 2 :(得分:1)
注意:这是Sam回答的更多细节
感谢Sam的回答。由于评论的空间限制,我把它放在答案中。
从你的答案中得出我看到两种可能的方法:
解决方案1:
解决方案2:
由于我们有两种方法,因此哪种方法最优化?两种方法都必须检索重复的行和报告,而第二种方法需要额外的:
如果这些是唯一的解决方案,在我看来,第一种方法获胜。你们有什么感想?谢谢!