你遇到的问题其实不是由于行终结者。我怀疑,有文件错误的结束一起,你也看到类似以下的东西:
Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 4 ({column_name}).
虽然我说的线以下是关于ROWTERMINATOR
仍然有效,真正的问题是由您的发言表示:
[the] table that has 7 columns. The data file only has the first 4 columns, the rest should be left NULL.
这是问题所在。当使用BULK INSERT
时,数据文件必须具有与要插入的表相同数量的字段。如果不是这种情况,那么您必须使用FORMATFILE ='format_file_path'
选项,在这种情况下,您需要创建一个Format File并指定位置。
我想你可以逃脱更容易OPENROWSET(BULK...),这样就可以做到以下几点:
INSERT INTO STAGING_TABLE
SELECT *
FROM OPENROWSET(BULK 'FILE_LOCATION' ...);
但是,这并不让你指定一个ROWTERMINATOR
不使用格式文件。因此,无论在哪种情况下都需要格式文件。
OR,你可以只导入到只有4列,然后是一个不同的临时表:
OR,由@PhilipKelley在这个答案的评论中提到,你可以创建一个只是那些四个字段的景色,有成为目标/目标。如果您正在执行适当的步骤以使操作被最低限度地记录下来,则Prerequisites for Minimal Logging in Bulk Import的MSDN页面不会以某种方式说出使用View的效果。
最有可能的\l
只是解释为这两个文本字符,因此它不尊重rowterminator
当你尝试过。
0x0A
将工作,因为我已测试它,它的行为如预期。你的语句应该如下所示:
BULK INSERT STAGING_TABLE
FROM 'FILE_LOCATION'
WITH (
DATAFILETYPE = 'widechar',
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0A'
);
我既没有在最后一行的末尾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)".
确保所有的数据文件中的行具有所需数量的字段分隔符(在这种情况下为,
)。你提到文件中有4列,所以每行应该是3个逗号。
谢谢,您提出的替代建议最终能够解决我的问题。这绝对是我在数据文件和登台表之间有不同列的事实。尽管如此,我仍然对此感到困惑,因为还有几个其他进程按照同样的方式构建,并且功能正确,尽管它们的列也不匹配。 在任何情况下,这一切都奏效了。谢谢! – 2014-12-11 16:40:27
@RazzleDazzle很高兴解决了它!关于其他类似的工作,你确定a)他们正在使用'BULK INSERT'而不是'OPENROWSET(BULK ...)'或'BCP.EXE',以及b)如果他们使用' BULK INSERT',他们还没有使用格式文件?我没有看到他们有可能在使用'BULK INSERT'的同时拥有不同数量的列和格式文件,除非这些列是IDENTITY或类似的东西(不能被插入)。 PS,你最终选择哪个实际修补程序?只是好奇:) – 2014-12-11 16:46:48
@RazzleDazzle只是FYI:我只是在目标表中额外的列进行测试。试图将它作为'DATETIME NOT NULL DEFAULT(GETDATE())'和'INT NOT NULL IDENTITY(1,1)',并且由于列数不匹配而失败。所以不知道没有格式化文件或使用“BULK INSERT”之外的其他进程如何工作。 – 2014-12-11 16:57:31