2

我已经使用 SQL Server 的BULK INSERT任务完成了数百次数据导入,但这次我收到了一个不熟悉的错误,并且我尝试使用 Google 进行故障排除无济于事。以下是我使用逗号分隔文件的代码,其中新行由换行符指示:

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

它始终有效,但现在在一个带有日期和速率的简单文件上,它失败,错误为“ Msg 4863, Level 16, State 1, Line 1 Bulk load data conversion error (truncation) for row 1, column 2 (ColumnTwo )。” 当我查看文件时,我不明白为什么会失败(通常 Google 故障排除表明分隔符可能在一行中存在多次,这会引发此错误)。从文件中,这里是前十行(注意它在第一行失败):

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

我将这些数据插入到的表有两个字段 thaare VARCHAR(50),即使当我最初看到截断时,我将数据字段扩展为VARCHAR(2000)它并没有影响它。

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

我还尝试删除所有破折号,看看这是否搞砸了(即使我已经使用相同的代码使用破折号进行了大量数据导入,并且它可以正常工作),但它仍然收到相同的错误消息。

与 SSIS 一样,直接导入(通过Tasks)可以工作,但是这段代码失败了怎么办,因为它应该做完全相同的事情?

4

2 回答 2

12

问题可能是由于文件格式,行终止符无法正常工作。

尝试:

ROWTERMINATOR = '0x0a'

编辑

实际上我只是注意到您使用的是正斜杠,它应该是反斜杠,所以这可能有效:

ROWTERMINATOR = '\n'
于 2013-03-01T15:26:08.687 回答
3

在 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')适用于所有环境。

于 2016-04-16T04:09:27.920 回答