我已经使用SQL Server的BULK INSERT
任务完成了数百次数据导入,但这次我收到的是一个不熟悉的错误,而且我尝试过排除故障而无法使用Google。以下是我使用逗号分隔文件的代码,其中新行由换行符表示:
BULK INSERT MyTable
FROM 'C:\myflatfile.txt'
WITH (
FIELDTERMINATOR = ','
,ROWTERMINATOR = '/n')
GO
它一直有效,但现在在一个带有日期和速率的简单文件上,它失败了“消息4863,等级16,状态1,行1行批量加载数据转换错误(截断)行的错误1,第2栏(ColumnTwo)。“当我查看该文件时,我不明白为什么会失败(通常Google故障排除表明分隔符可能在一行中多次出现,这会引发此错误)。从文件中,这是前十行(注意它在FIRST行上失败):
1961-01-01,8.2
1961-02-01,8.2
1961-03-01,7.4
1961-04-01,7.6
1961-05-01,7.8
1961-06-01,8.5
1961-07-01,9.1
1961-08-01,8.8
1961-09-01,8.4
1961-10-01,8.8
我正在插入这些数据的表有两个字段VARCHAR(50)
,即使我最初看到截断时我将数据字段扩展为VARCHAR(2000)
并且它不会影响它。
CREATE TABLE MyTable (
ColumnOne VARCHAR(50),
ColumnTwo VARCHAR(50)
)
我也尝试删除所有破折号,看看是不是搞乱了事情(尽管我使用相同的代码完成了大量的破折号数据导入并且没有错误),并且它仍然收到相同的错误消息
直接导入与SSIS一样(通过Tasks
),但是这段代码失败了,因为它应该做同样的事情?
答案 0 :(得分:12)
由于文件格式,行终结器可能无法正常工作。
尝试:
ROWTERMINATOR = '0x0a'
修改
实际上我只是注意到你正在使用正斜杠,它应该是反斜杠,所以这可能有效:
ROWTERMINATOR = '\n'
答案 1 :(得分:3)
从SQL Server Management Studio(SSMS),对于Unix风格的文件,ROWTERMINATOR ='0x0a'有效。但是,ROWTERMINATOR ='\ n'不会,因为SSMS显然将\ n解释为Windows样式的行结束序列(\ r \ n)并修复/打破它。
有趣的是,如果您通过SQL Server JDBC驱动程序从Java代码发送相同的ROWTERMINATOR ='\ n',它将被视为Unix风格的行尾,因为中间没有任何东西会引发额外的\河
所以,你必须做两件事:
1 - 确保您了解数据文件的实际行为结果。
2 - 确保您了解向SQL Server提供BULK INSERT sql的方式是如何解释任何转义序列的。我的有限经验是,对于SQL Server SQL使用十六进制('0x0a')适用于所有环境。