【问题标题】:Getting error while bulk insertion批量插入时出错
【发布时间】:2018-10-13 15:30:42
【问题描述】:

我在尝试批量插入时遇到错误:

BULK INSERT #tbl_InterCompanyUploadDetail_Staging 
FROM '\\SVRP03546008461D\QA\UploadTemplatewithvalidation.xlsx'
 WITH (FIRSTROW = 6, FIELDTERMINATOR ='\t', ROWTERMINATOR ='\\n' )

我得到的错误是:

第 6 行第 2 列(Oracle 公司代码)的批量加载数据转换错误(截断)。

Excel 中的列数据为 470,数据库中的列数据为 varchar (10)。 那么错误的原因可能是什么。

【问题讨论】:

  • 正如错误消息所说,截断是错误的原因。推测数据中的列有10多个字符。
  • 不,我只有十行,每行有 3 个字符。这就是我感到困惑的原因。
  • 我不知道BULK INSERT 可以插入.xlsx 文件。除非这是一个新功能....我认为这是不可能的。用记事本打开这个文件是什么样子的?
  • 文档解释得很好:Import data from Excel to SQL ServerBULK INSERT 仅支持纯文本文件,无法从 Excel 文件中读取。
  • 拼写出来:您首先需要将 xlsx 文件导出为文本文件(例如 CSV),然后导入文本文件。

标签: sql sql-server excel tsql bulkinsert


【解决方案1】:

问题

BULK INSERT 可能不适用于 xlsx 文件,请尝试将 .xlsx 文件转换为 .csv 文件以实现此目的(使用 BULK INSERT

第一个解决方案 - 使用 OPENROWSET

尝试将OPENROWSETMicrosoft.ACE.OLEDB.12.0 提供程序一起使用:

Insert into <rawdatatable> 
select * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
                         'Excel 12.0;Database=D:\SSIS\FileToLoad.xlsx;HDR=YES', 
                         'SELECT * FROM [Sheet1$]')

SELECT * INTO Data_dq
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0; Database=D:\Desktop\Data.xlsx', [Sheet1$]);

第二个解决方案 - 使用 OPENDATASOURCE

SELECT * INTO Data_dq
FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0',
'Data Source=D:\Desktop\Data.xlsx;Extended Properties=Excel 12.0')...[Sheet1$];

参考文献

【讨论】:

    【解决方案2】:

    将“\n”替换为“0x0a”作为ROWTERMINATOR,然后重试。

    也可以

     ROWTERMINATOR = '''+cast (0x0000 as char(1))+'''
    

    让我知道它是否有效。

    还要检查this

    【讨论】:

    • '''+cast (0x0000 as char(1))+''' 这不起作用,使用“0x0a”时出现错误:“批量加载数据转换错误(截断)行”
    • 你也检查了链接?
    【解决方案3】:

    我怀疑将 XLSX 文件与 BULK INSERT 一起使用。如果支持 XLSX 文件,则不需要 FIELDTERMINATOR 和 ROWTERMINATOR。

    XLSX 是 zip 文件,所以我猜(但不确定)XLSX 不受支持,并且您收到截断错误,因为它正在将其作为纯文本文件读取,并且 BULK INSERT 将长文本发送到 FIELDTERMINATOR。

    为了确认,您尝试将列的长度增加到几千个字符并运行 BULK INSERT,如果您得到垃圾字符,那么它将作为纯文本文件读取。可能是垃圾字符,可能与您在记事本或记事本++中打开相同的 xlsx 文件相同。

    【讨论】:

      【解决方案4】:

      您不能将 XLSX 批量加载到 SQL Server 中。您可以将 XLSX 转换为制表符分隔的文本文件并批量加载。

      如果这是一次性操作,我建议先转换为文本(但要注意 Excel 如何导出某些类型,如日期和大数字)。或者您可以使用导入/导出向导 (https://docs.microsoft.com/en-us/sql/relational-databases/import-export/import-data-from-excel-to-sql)

      如果这是您需要重复的过程,我会创建一个 SSIS 脚本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-27
        • 2015-06-16
        • 1970-01-01
        • 1970-01-01
        • 2018-04-10
        • 2016-02-04
        相关资源
        最近更新 更多