SQL Server批量插入固定宽度文件失败

时间:2014-06-27 14:02:26

标签: sql sql-server bulkinsert

我正在尝试使用批量插入来上传非常大的数据文件(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时,它的运行速度要快得多(我假设更少,更大的转换),但它仍然失败。

这是否与批量插入识别文件末尾有关?如果是这样,我需要对格式文件做些什么来修复它?

4 个答案:

答案 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     ""