批量插入时如何自动截断字符串?

时间:2011-06-19 04:55:16

标签: c# .net sql-server sqlbulkcopy

我想在SQL Server中插入许多行(从Entity Framework对象构造)。问题是,某些字符串属性的长度超出了数据库中列的长度,这会导致异常,然后所有行都无法插入到数据库中。

所以我想知道如果有办法告诉SqlBulkCopy自动截断任何超长行?当然,在将每个属性超出有限长度之前,我可以检查并子串,然后将其插入到DataTable中,但这会降低整个程序的速度。

3 个答案:

答案 0 :(得分:9)

始终使用暂存/加载表进行批量操作。

然后您可以在刷新到真实表之前处理,清理,擦洗等数据。这包括LEFT,查找,重复数据删除等

所以:

  1. 使用 wide
  2. 加载临时表
  3. 使用INSERT realtable (..) SELECT LEFT(..), .. FROM Staging
  4. 从登台刷到“真实”牌桌

答案 1 :(得分:7)

不幸的是,SqlBulkCopy没有直接方式。 SQL Bulk Inserts本质上几乎是“哑”,但这就是为什么它们如此之快。它们甚至没有被记录(捕获SqlRowsCopied事件除外),所以如果出现故障,则没有太多信息。你在寻找什么会在某种程度上违背本课程的目的

但可能有两种可能的方式:

  • 您可以尝试使用SqlBulkCopyOptions枚举(传递给SqlBulkCopy() Constructor)并使用SqlBulkCopyOptions.CheckConstraints(在插入数据时检查约束。默认情况下,不检查约束。)

  • 或者您可以使用 SqlBulkCopyOptions.FireTriggers 枚举(如果指定,则导致服务器触发插入数据库的行的插入触发器。)并处理异常SQL Server Insert Trigger

答案 2 :(得分:-1)

尝试在使用SQLBulkCopy类时使用SQLTransaction类