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


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

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


5140
2018-06-19 04:55


起源



答案:


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

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

所以:

  1. 使用加载临时表  列
  2. 使用,从分段到“真实”表格 INSERT realtable (..) SELECT LEFT(..), .. FROM Staging

9
2018-06-19 09:14





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

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

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

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


7
2018-06-19 05:04



-1触发器触发太迟:在代码运行之前发生截断。检查仍然给出例外。 Op回到他们开始的地方。 - gbn
+0.5?使用INSTEAD OF INSERT触发器可以修剪插入数据,但是临时表是更好的路径。 - SqlACID


答案:


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

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

所以:

  1. 使用加载临时表  列
  2. 使用,从分段到“真实”表格 INSERT realtable (..) SELECT LEFT(..), .. FROM Staging

9
2018-06-19 09:14





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

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

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

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


7
2018-06-19 05:04



-1触发器触发太迟:在代码运行之前发生截断。检查仍然给出例外。 Op回到他们开始的地方。 - gbn
+0.5?使用INSTEAD OF INSERT触发器可以修剪插入数据,但是临时表是更好的路径。 - SqlACID


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


-1
2017-07-22 07:10