【问题标题】:Bulk load data conversion error (truncation)批量加载数据转换错误(截断)
【发布时间】:2011-11-23 03:48:56
【问题描述】:

我收到这个错误

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

这里是 csv...它只有一行

30,Bill,Worthy,sales,,709888499,bat@bat.com,,"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


    【解决方案1】:

    它选择 cmets 字段中的逗号作为分隔符,因为分隔符不一致。最好的解决方案是确保所有字段都用双引号括起来,并将FIELDTERMINATOR 设置为'","'。或者,将逗号替换为不太可能出现在 cmets 中的内容(例如 ~)并设置为 FIELDTERMINATOR = '~'

    【讨论】:

      【解决方案2】:

      除了 Wil 的 cmets,它似乎看到了所有 12 列,因此可能只是您的行终止符不正确。首先,确保将这些文件放在一起的程序实际上是在最后一行的末尾放置了一个回车;我不得不纠正许多不是这种情况的程序。一旦你确定那里有回车,你可能需要尝试看看它是什么类型的回车。有时它只有 char(10),有时只有 char(13),有时它可能两者都有,但顺序错误。所以尝试一下:

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

      【讨论】:

      • 通常,如果行终止符不正确或不一致,它可能会导致它合并行,直到遇到可识别的终止符甚至 eof。我以前也遇到过这种情况。
      【解决方案3】:

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

      对于上述错误,您可以检查

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

      【讨论】:

      • 0x0A 的 ROWTERMINATOR 为我做的,不是 \n 或 \r 组合。
      • 现在搜索了一段时间。 '0x0A' 是为我做的。此解决方案提供了与错误相关的多种解决方案,并且可能会解决错误。
      【解决方案4】:

      我将标题作为第一行。在我删除它之后,它很好。

      【讨论】:

        【解决方案5】:

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

        FORMAT ='CSV'
        

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            我已经从 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 代替该字段时,一切都很好。

            两种情况下的表格创建都是相同的,但我可能对database1database2 有不同之处,我还没有意识到:D

            【讨论】:

              猜你喜欢
              • 2013-02-16
              • 1970-01-01
              • 1970-01-01
              • 2013-11-10
              • 1970-01-01
              • 2012-10-26
              • 1970-01-01
              • 2017-08-09
              • 2015-09-28
              相关资源
              最近更新 更多