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列并且以看似随机的间隔分割.
任何人都有任何想法?我应该澄清一些吗?
您遇到的问题实际上不是由于行终结器.我怀疑,除了文件结束错误,您还看到了类似于以下内容的内容:
消息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个逗号.