2013-03-01 126 views
2

我已经完成了数据导入与SQL Server的BULK INSERT任务数百次,但这次我收到一个不熟悉的错误,并且我尝试了解疑难解答Google无济于事。以下是我在新行被新行字符表示逗号deliminated文件中使用的代码:批量插入失败“批量加载数据转换错误(截断)”

BULK INSERT MyTable 
FROM 'C:\myflatfile.txt' 
WITH (
    FIELDTERMINATOR = ',' 
    ,ROWTERMINATOR = '/n') 
GO 

它始终如一地努力,但现在有一个日期和速率的简单的文件,它与失败错误“消息4863,级别16,状态1,行1批量加载数据转换错误(截断)为第1行,第2列(ColumnTwo)。”当我查看文件时,我不明白为什么会失败(通常Google故障排除表明分隔符可能存在多行,这会引发此错误)。从文件,这里是第10行(注意,它无法在第一行):

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 

表,我将这些数据转换成有两个字段thare是VARCHAR(50),即使当我最初看到截断我扩大了数据字段到VARCHAR(2000),它并没有影响它。

CREATE TABLE MyTable (
    ColumnOne VARCHAR(50), 
    ColumnTwo VARCHAR(50) 
) 

我也试图消除所有的破折号,看看是否被搞乱的东西(虽然我已经做了充足的数据进口使用相同的代码破折号和它的作品没有错误),它仍然收到相同的错误信息。

与SSIS一样,直接导入工作(通过Tasks),但该代码失败了,因为它应该完成同样的事情?

回答

11

由于文件格式,问题很可能是行终止符不工作。

尝试:

ROWTERMINATOR = '0x0a' 

编辑

其实我刚才注意到您使用的斜线,它应该是反斜杠,所以这可能工作:

ROWTERMINATOR = '\n' 
+0

谢谢;我怎么能区分它是'/ n'还是'0x0a',就像文件中它看起来是一个新的行字符一样?在此之前我没有看过这个。 – Tim 2013-03-01 15:37:53

+0

如果您的文件来自基于UNIX的系统,则应该正常使用'0x0a'(因为UNIX仅使用\ n - 换行符作为终止符)。如果你的文件是基于Windows的,即使你只指定了\ n(这是回车和换行符),bulkcopy实际上也会使用\ r \ n。 – EkoostikMartin 2013-03-01 15:43:50

2

从SQL Server Management Studio中(SSMS),对于Unix风格的文件,ROWTERMINATOR ='0x0a'起作用。但是,ROWTERMINATOR ='\ n'并不是因为SSMS明显将\ n解释为Windows风格的序列末尾(\ r \ n)并为您修复/打破它。有趣的是,如果您通过SQL Server JDBC驱动程序从Java代码发送相同的ROWTERMINATOR ='\ n',则它将被视为Unix风格的行尾,因为中间没有任何内容会引发额外\ r。

所以,你必须做两件事情:

1 - 确保你了解你的数据文件实际上是如何做结束线。

2 - 确保您了解将BULK INSERT sql传递给SQL Server的方式是如何解释任何转义序列。我有限的经验是,对于SQL Server SQL,使用十六进制('0x0a')可在所有环境中使用。