我在尝试批量插入时遇到错误:
BULK INSERT #tbl_InterCompanyUploadDetail_Staging
FROM '\\SVRP03546008461D\QA\UploadTemplatewithvalidation.xlsx'
WITH (FIRSTROW = 6, FIELDTERMINATOR ='\t', ROWTERMINATOR ='\\n' )
我得到的错误是:
第6行第2列(Oracle公司代码)的批量加载数据转换错误(截断)。
Excel中的列的数据为470,数据库列中的列为varchar(10)。 那么可能是错误的原因。
答案 0 :(得分:5)
BULK INSERT
可能无法与xlsx文件一起使用,请尝试将.xlsx
文件转换为.csv
文件以实现此(使用BULK INSERT
) < / p>
尝试将OPENROWSET
与Microsoft.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$]);
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脚本。