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')
4

3 回答 3

0

为什么不使用SqlBulkCopy,然后捕获使用SqlRowsCopied事件复制的行。这将更接近地模仿BULK INSERTT-SQL 命令。

编辑:看起来错误处理对于 SqlBulkCopy 来说不是那么健壮。但是,这是一个似乎可以满足您要求的示例:

http://www.codeproject.com/Articles/387465/Retrieving-failed-records-after-an-SqlBulkCopy-exc

于 2012-07-19T18:57:47.397 回答
0

由于 .NET 支持 SQL 形式的所有数据类型,因此您应该能够在 .NET 中使用 TryParse 来捕获任何转换错误。您还需要在 SQL 数据范围内进行测试。关于文本需要测试长度。如果我解析一些 CSV,我会在一些非常大的插入上执行此操作。TryParse 非常快。比 Try Catch 更好,因为它没有抛出和错误的开销。

为什么不插入 .NET C#。有一个用于批量复制的类。我在解析时使用 TVP 异步插入,一次执行 10,000 个。

于 2012-07-19T19:18:40.290 回答
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; 结束捕获

于 2021-07-23T20:06:02.707 回答