我想在SQL Server中插入许多行(从Entity Framework对象构造)。问题是,某些字符串属性的长度超出了数据库中列的长度,这会导致异常,然后所有行都无法插入到数据库中。
所以我想知道如果有办法告诉SqlBulkCopy自动截断任何超长行?当然,在将每个属性超出有限长度之前,我可以检查并子串,然后将其插入到DataTable中,但这会降低整个程序的速度。
答案 0 :(得分:9)
始终使用暂存/加载表进行批量操作。
然后您可以在刷新到真实表之前处理,清理,擦洗等数据。这包括LEFT,查找,重复数据删除等
所以:
INSERT realtable (..) SELECT LEFT(..), .. FROM Staging
答案 1 :(得分:7)
不幸的是,SqlBulkCopy
没有直接方式。 SQL Bulk Inserts本质上几乎是“哑”,但这就是为什么它们如此之快。它们甚至没有被记录(捕获SqlRowsCopied
事件除外),所以如果出现故障,则没有太多信息。你在寻找什么会在某种程度上违背本课程的目的
但可能有两种可能的方式:
您可以尝试使用SqlBulkCopyOptions
枚举(传递给SqlBulkCopy() Constructor)并使用SqlBulkCopyOptions.CheckConstraints
(在插入数据时检查约束。默认情况下,不检查约束。)
或者您可以使用 SqlBulkCopyOptions.FireTriggers
枚举(如果指定,则导致服务器触发插入数据库的行的插入触发器。)并处理异常SQL Server Insert Trigger
。
答案 2 :(得分:-1)
尝试在使用SQLBulkCopy类时使用SQLTransaction类