我正在处理非常大的分隔文件。这些文件已经过预处理,以确保字段和行分隔符有效。偶尔会处理一行,导致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')
答案 0 :(得分:0)
为什么不使用SqlBulkCopy,然后捕获使用SqlRowsCopied事件复制的行。这将更接近地模仿BULK INSERT
T-SQL命令。
编辑:看起来错误处理不是SqlBulkCopy的强大功能。但是,这是一个似乎正在寻找你想要的例子:
http://www.codeproject.com/Articles/387465/Retrieving-failed-records-after-an-SqlBulkCopy-exc
答案 1 :(得分:0)
由于.NET支持所有数据类型为SQL,因此您应该能够在.NET中使用TryParse来捕获任何转换错误。在日期,您还需要在SQL数据范围内进行测试。在文本上需要测试长度。我在一些非常大的插件上做了这个,我解析了一些CSV。 TryParse非常快。比Try Catch更好,因为它没有投掷和错误的开销。
为什么不在.NET C#中插入。有一个批量复制课程。我在解析时使用TVP异步插入,一次做10,000个。
答案 2 :(得分:0)
似乎是对每一行有错误但只是被SQL统计的行抛出异常。但是,它也被传递回 C#(在我的例子中是 SSIS)。我发现当超过 MAXERRORS 发生时,使用 TRY/CATCH 逻辑包装批量插入并使用 THROW(重新抛出异常)对我有用。
开始尝试 BULK INSERT #some-table FROM 'filename' WITH(FIELDTERMINATOR ='\0',ROWTERMINATOR ='\n',FIRSTROW = 2, MAXERRORS = 100, ERRORFILE = '一些文件') 结束尝试 开始捕捉 扔; 收尾