我正在尝试使用批量插入来上传非常大的数据文件(5M行)。所有列都只是varchars没有转换。所以格式文件很简单......
11.0
29
1 SQLCHAR 0 8 "" 1 AccountId ""
2 SQLCHAR 0 10 "" 2 TranDate ""
3 SQLCHAR 0 4 "" 3 TransCode ""
4 SQLCHAR 0 2 "" 4 AdditionalCode ""
5 SQLCHAR 0 11 "" 5 CurrentPrincipal ""
6 SQLCHAR 0 11 "" 6 CurrentInterest ""
7 SQLCHAR 0 11 "" 7 LateInterest ""
...
27 SQLCHAR 0 8 "" 27 Operator ""
28 SQLCHAR 0 10 "" 28 UpdateDate ""
29 SQLCHAR 0 12 "" 29 TimeUpdated ""
但每次,在某些时候,我都会得到同样的错误:
Msg 4832,Level 16,State 1,Line 1批量加载:意外结束 在数据文件中遇到了文件。 Msg 7399,Level 16,State 1, 第1行OLE DB提供程序" BULK"对于链接服务器"(null)"报道 一个错误。提供商未提供有关错误的任何信息。 消息7330,级别16,状态2,行1无法从OLE DB中获取行 提供者" BULK"对于链接服务器"(null)"。
我尝试了以下内容:
Bulk Insert
[TableName] From 'dataFilePPathSpecification'
With (FORMATFILE = 'formatFilePPathSpecification')
但是我在大约5-6分钟后收到错误,并且没有插入任何数据。
当我添加BatchSize参数时,除了已成功插入极少数行之外,我在文件末尾附近经过很长时间后才会收到错误。
Bulk Insert
[TableName] From 'dataFilePPathSpecification'
With (BATCHSIZE = 200,
FORMATFILE = 'formatFilePPathSpecification')
当我将BatchSize设置为2000时,它的运行速度要快得多(我假设更少,更大的转换),但它仍然失败。
这是否与批量插入识别文件末尾有关?如果是这样,我需要对格式文件做些什么来修复它?
答案 0 :(得分:1)
尝试使用WITH部分中的errorFile说明符来查找有问题的数据:
ERRORFILE =' C:\ offendingdata.log'
答案 1 :(得分:1)
如果在启用错误文件输出后仍然有问题,可以通过设置FirstRow和LastRow选项并重复运行批量插入来解决问题,从而对问题进行二进制搜索。
老实说,您的输入格式看起来很简单,在尝试导入之前编写一个小的C#,Python或任何浮动您的船应用程序以质量检查数据可能是个好主意。您可以简单地丢弃无效行(或者可能修复它们)或将它们写入异常文件以进行手动处理,或者只是停止作业 - 即,文件必须完美或被视为已损坏。以这种方式验证5M行将非常快 - 基本上与您可以读取文件(以及可能的写入)文件一样快。
答案 2 :(得分:1)
明确说明行终止符:
BULK INSERT TableName FROM 'Path'
WITH (
DATAFILETYPE = 'char',
ROWTERMINATOR = '\r\n'
With (FORMATFILE = 'formatFilePPathSpecification')
);
如果仍然失败,请检查您的文件,看看您是否在文本字段中嵌入了意外的终止符。
答案 3 :(得分:0)
感谢所有人的建议,我应用了两个想法...我写了一个小的.Net(c#)文件处理器实用程序,它告诉我还有其他空值(每行末尾有二进制零(\ 0)) ,我能够使用一个简单的c#程序剥离它们。
错误文件表明问题已经到了最后,(那是msg所说的错误!)
实际问题是批量插入无法识别EOF ..我必须像这样修改格式文件来修复它..然后它就可以了。
11.0
29
1 SQLCHAR 0 8 "" 1 AccountId ""
2 SQLCHAR 0 10 "" 2 TranDate ""
3 SQLCHAR 0 4 "" 3 TransCode ""
4 SQLCHAR 0 2 "" 4 AdditionalCode ""
5 SQLCHAR 0 11 "" 5 CurrentPrincipa ""
6 SQLCHAR 0 11 "" 6 CurrentInterest ""
7 SQLCHAR 0 11 "" 7 LateInterest ""
...
27 SQLCHAR 0 8 "" 27 Operator ""
28 SQLCHAR 0 10 "" 28 UpdateDate ""
29 SQLCHAR 0 12 "\r\n" 29 TimeUpdated ""