批量插入时出错

时间:2018-05-03 10:39:16

标签: sql sql-server excel tsql bulkinsert

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

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

我得到的错误是:

  

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

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

4 个答案:

答案 0 :(得分:5)

问题

BULK INSERT可能无法与xlsx文件一起使用,请尝试将.xlsx文件转换为.csv文件以实现此(使用BULK INSERT < / p>

第一个解决方案 - 使用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$]')

OR

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$];

参考

答案 1 :(得分:0)

替换&#34; \ n&#34;用&#34; 0x0a&#34;作为ROWTERMINATOR再试一次。

或者

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

让我知道它是否有效。

同时检查this

答案 2 :(得分:0)

我怀疑使用带有BULK INSERT的XLSX文件。如果支持XLSX文件,则不需要FIELDTERMINATOR和ROWTERMINATOR。

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

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

答案 3 :(得分:0)

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

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

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