批量插入 - UNIX文件的行终止符+"\ l"行终止符

Raz*_*zle 9 sql bulkinsert sql-server-2008-r2

所以我一直在和BULK INSERT一起解决一个令人困惑的问题.这些文件来自Linux盒子,当我以十六进制编辑模式/ notepad ++查看它们时,它们似乎只有一个换行符(0A)作为行终止符.我将批量插入语句存储在一个表中,以后作业将从中选择并执行表中的语句以将数据加载到临时表中.

困扰我的特殊情况是一个包含7列的表.数据文件只有前4列,其余应为NULL.

通常它们看起来像这样:

BULK INSERT STAGING_TABLE  FROM 'FILE_LOCATION'  
WITH     (   
DATAFILETYPE = 'widechar'
,   FIELDTERMINATOR = ','
,   ROWTERMINATOR = 'something_here'   
);
Run Code Online (Sandbox Code Playgroud)

行终止符是我问题的最大来源.

当我尝试使用"\n"时,批量插入在截断错误上失败 - 它似乎将文件视为一个长字符串,并且只能正确地分隔列,直到它用完列(因此截断错误).

当我使用"0x0a"时,批量插入在"意外的文件结束"错误时失败.文件末尾有一个空白行,但即使我删除它仍然会抛出相同的错误,所以我不确定那里有什么问题.

到目前为止,唯一一个用于将数据实际存入表格的工作是"\ l".有谁知道这意味着什么?我搜索的范围很广,但似乎没有关于它的文档.那个或我一直在找错了地方.

与\ l作为rowterminator的奇怪之处在于,即使它成功加载,它仍然不尊重rowterminator ......行只是被加载到所有7列并且以看似随机的间隔分割.

任何人都有任何想法?我应该澄清一些吗?

Sol*_*zky 7

您遇到的问题实际上不是由于行终结器.我怀疑,除了文件结束错误,您还看到了类似于以下内容的内容:

消息4864,级别16,状态1,行1
第1行第4列({column_name})的批量装入数据转换错误(指定代码页的类型不匹配或无效字符).

虽然我在下面所说的内容仍然有效ROWTERMINATOR,但您的声明表明了真正的问题:

[表]有7列.数据文件只有前4列,其余应为NULL.

这是问题所在.使用时BULK INSERT,数据文件必须具有与要插入的表相同数量的字段.如果不是这种情况,则必须使用该FORMATFILE ='format_file_path'选项,在这种情况下,您需要创建格式文件并指定位置.

我以为你可以通过更简单的OPENROWSET(BULK ......)来逃脱,这样你就可以做到以下几点:

INSERT INTO STAGING_TABLE
   SELECT *
   FROM   OPENROWSET(BULK 'FILE_LOCATION' ...);
Run Code Online (Sandbox Code Playgroud)

但是,这不允许您在ROWTERMINATOR不使用格式文件的情况下指定.因此,在任何一种情况下都需要格式文件.

或者,您可以导入到只有4列的不同临时表中,然后执行以下任一操作:

  • 将其转储到您当前的STAGING_TABLE中,或者

  • 做一个ALTER TABLE添加3个缺失的列(添加3个NULLable字段比将数据从一个表传输到另一个表更有效:-).

或者,正如@PhilipKelley在对此答案的评论中所提到的,您可以创建一个仅包含这四个字段的视图,并将其作为目标/目标.如果您正在执行适当的步骤以使操作最小化,则批量导入中的最小日志记录的先决条件的MSDN页面不会说明使用视图时效果的方式.


很可能\l只是被解释为那两个字面字符,因此它不尊重rowterminator你何时尝试它.

0x0A将是我测试它的工作,它的行为符合预期.您的陈述应如下所示:

BULK INSERT STAGING_TABLE
FROM 'FILE_LOCATION'  
WITH (   
       DATAFILETYPE = 'widechar',
       FIELDTERMINATOR = ',',
       ROWTERMINATOR = '0x0A'
);
Run Code Online (Sandbox Code Playgroud)

0x0A在最后一行的末尾尝试了有和没有角色,两者都是一样的.

然后我从其中一行中删除了一个逗号,使其少于完整的字段集,这就是我收到以下错误时:

Msg 4832, Level 16, State 1, Line 2
   Bulk load: An unexpected end of file was encountered in the data file.
Msg 7399, Level 16, State 1, Line 2
   The OLE DB provider "BULK" for linked server "(null)" reported an error. The 
                 provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 2
   Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".
Run Code Online (Sandbox Code Playgroud)

确保数据文件中的所有行都具有所需数量的字段分隔符(,在本例中).你提到文件中有4列,所以每行应该有3个逗号.