批量加载数据转换错误(截断)

问题描述 投票:0回答:8

我收到此错误

Bulk load data conversion error (truncation) for row 1, column 12 (is_download)

这是 csv...它只有一行

30,Bill,Worthy,sales,,709888499,[email protected],,"Im a a people person., to work together for this new emerging env.HTTP://applesoftware.com","Bill and Son of Co","Contact Us: Contact Form",0

这是我的批量插入语句...

SE SalesLogix
GO

CREATE TABLE CSVTemp
(id INT,
firstname VARCHAR(255),
lastname VARCHAR(255),
department VARCHAR(255),
architecture VARCHAR(255),
phone VARCHAR(255),
email VARCHAR(255),
download VARCHAR(255),
comments VARCHAR(MAX),
company VARCHAR(255),
location VARCHAR(255),
is_download VARCHAR(255)
)
GO

BULK
INSERT CSVTemp
FROM 'c:\leads\leads.csv'
WITH
(
DATAFILETYPE = 'char', 
BATCHSIZE = 50, 
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '\n' 
)
GO
--Check the content of the table.
SELECT *
FROM CSVTemp
GO

问题是大多数时候它工作得很好,但在某些情况下(这是其中之一)我会收到错误

任何关于导致此记录出现此错误的原因的想法

sql sql-server sql-server-2008 csv bulkinsert
8个回答
17
投票

它会选择注释字段中的逗号作为分隔符,因为分隔符不一致。最好的解决方案是确保所有字段都用双引号引起来,并将

FIELDTERMINATOR
设置为
'","'
。或者,将逗号替换为注释中不太可能出现的内容(例如
~
)并设置
FIELDTERMINATOR = '~'


11
投票

除了 Wil 的评论之外,它似乎看到了所有 12 列,因此可能只是您的行终止符不正确。首先,确保将这些文件放在一起的程序实际上在最后一行的末尾添加了回车符;我必须纠正许多并非如此的程序。一旦确定那里有回车符,您可能必须尝试看看它是什么类型的回车符。有时仅是 char(10),有时仅是 char(13),有时可能两者都有,但顺序错误。所以尝试一下:

ROWTERMINATOR = '\n'
ROWTERMINATOR = '\r'
ROWTERMINATOR = '\n\r'
ROWTERMINATOR = '\r\n'

6
投票

System.Data.SqlClient.SqlException(0x80131904):第 97 行第 33 列的批量加载数据转换错误(截断)

对于以上错误,您可以检查一下

  • 列的数据类型大小(例如VARCHAR(255))是是否足以导入数据。
  • 行终止符 例如
    • 行终止符 = '0x0A'
    • 行终止符 = ' '
    • 行终止符 = ' '
  • 现场终结者
    • 确保所选字段终止符不会出现在数据中。如果有机会,请将其替换为其他字符,例如|在文件中。

1
投票

我将标题作为第一行。我把它去掉后,就很好了。


0
投票

通过在批量插入中使用以下内容可以轻松解决此问题:

FORMAT ='CSV'

这会处理字符串中的逗号。

如果对您有帮助,请选择它作为答案。


0
投票

从“.csv”文件导出/导入数据时请小心。将所有“NULL”替换为空字符串。


0
投票

我已经从 SQL 2016 导出了格式文件

bcp database1.dbo.table1 format nul -f FMTFLDR\table1.fmt -w -S SERVERNAME -T

并使用

将数据导入到 SQL 2017
BULK INSERT database2.dbo.table1 FROM 'DATAFLDR\table1.data' WITH ( FORMATFILE = 'FMTFLDR\table1.fmt');

由于某种原因,在几个表上,其中一列的导出为

SQLCHAR
并报告了截断错误。当我手动更新格式文件以代替该字段使用
SQLNCHAR
时,一切都很好。

两种情况下的表格创建是相同的,但我可能在

database1
database2
方面有所不同,我还没有意识到:D


0
投票

如果以上方法都没有帮助,就像我的情况一样,那么您需要检查目标表的某一列的维度是否低于源表中的维度

© www.soinside.com 2019 - 2024. All rights reserved.