TSQL BULK INSERT 行错误导致 C# 异常

3
我正在处理非常大的分隔文件。这些文件已经进行了预处理,以确保字段和行定界符是有效的。偶尔会处理一个未能满足TSQL约束的行(通常是数据类型问题)。在这种情况下,“修复”输入数据不是一个选项。
我们使用 MAXERRORS 设置可接受的输入错误数量,并使用 ERRORFILE 记录失败的行。
批量插入在 SSMS 中完成,对于每个失败的行,在消息窗口记录严重级别为 16 的错误消息。尝试通过 C# SqlCommand 类执行此代码时,当生成第一个严重级别为 16 的错误消息时,将引发异常,导致批次失败。
是否有一种方法可以通过 C# 和类似 SqlCommand 的方式完成操作并忽略 SQL 错误消息?
示例命令:
BULK INSERT #some-table FROM 'filename' 
WITH(FIELDTERMINATOR ='\0',ROWTERMINATOR ='\n',FIRSTROW = 2, MAXERRORS = 100, ERRORFILE = 'some-file')

1
你考虑过使用SSIS吗? - HLGEM
@HLGEM 我们正在使用 SQL 2008 Express。我的理解是,在那个级别上,SSIS缺乏我需要的功能。 - jhappoldt
3个回答

0

看起来每一行出现错误时,SQL会抛出一个异常,但只是计数。然而,在我的情况下,它也会传递回C#(SSIS)。我发现将批量插入操作用TRY/CATCH逻辑包装,并在超过MAXERRORS时使用THROW(重新抛出异常),对我很有效。

BEGIN TRY BULK INSERT #some-table FROM 'filename' WITH(FIELDTERMINATOR ='\0',ROWTERMINATOR ='\n',FIRSTROW = 2, MAXERRORS = 100, ERRORFILE = 'some-file') END TRY BEGIN CATCH THROW; END CATCH


0

0

由于.NET支持所有SQL数据类型,因此您应该能够在.NET中使用TryParse捕获任何转换错误。对于日期,您还需要测试SQL数据范围内的日期。对于文本,需要测试长度。我在一些非常大的插入操作中确实这样做,其中我将一些CSV解析为较小的部分。TryParse非常快。比Try Catch更好,因为它没有抛出错误的开销。

为什么不在.NET C#中进行插入呢?有一个类可以进行批量复制。我使用TVP异步插入,同时解析并每次处理10,000个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接