批量插入时出错
Getting error while bulk insertion
我在尝试批量插入时遇到错误:
BULK INSERT #tbl_InterCompanyUploadDetail_Staging
FROM '\SVRP03546008461D\QA\UploadTemplatewithvalidation.xlsx'
WITH (FIRSTROW = 6, FIELDTERMINATOR ='\t', ROWTERMINATOR ='\n' )
我得到的错误是:
Bulk load data conversion error (truncation) for row 6, column 2 (Oracle Company Code).
Excel中的列的数据为470,数据库列中的数据为varchar(10)。
那么错误的原因可能是什么。
将“\n”替换为“0x0a”作为 ROWTERMINATOR,然后重试。
或者也
ROWTERMINATOR = '''+cast (0x0000 as char(1))+'''
如果有效请告诉我。
同时检查 this。
我怀疑将 XLSX 文件与 BULK INSERT 一起使用。如果支持 XLSX 文件,则不需要 FIELDTERMINATOR 和 ROWTERMINATOR。
XLSX 是 zip 文件,所以我猜(但不确定)XLSX 不受支持并且您收到 t运行cation 错误,因为它将它作为纯文本文件读取并且 BULK INSERT 获取长文本直至 FIELDTERMINATOR .
为了确认,您尝试将列的长度增加到数千个字符,然后 运行 批量插入,如果出现垃圾字符,那么它会将其作为纯文本文件读取。可能是垃圾字符,可能与您在记事本或记事本++中打开相同的 xlsx 文件相同。
您无法将 XLSX 批量加载到 SQL 服务器。您可以将 XLSX 转换为制表符分隔的文本文件并批量加载。
如果这是一次性操作,我会建议先转换为文本(但要注意 Excel 如何导出某些类型,如日期和大数字)。或者您可以使用 Import/Export 向导 (https://docs.microsoft.com/en-us/sql/relational-databases/import-export/import-data-from-excel-to-sql)
如果这是您需要重复的过程,我会创建一个 SSIS 脚本。
问题
BULK INSERT
可能不适用于 xlsx 文件,请尝试将 .xlsx
文件转换为 .csv
文件以实现此 (使用 BULK INSERT
)
第一个解决方案 - 使用 OPENROWSET
尝试将 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$]')
或
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$];
参考资料
- Import/Export Excel (.Xlsx) or (.Xls) File into SQL Server
- Import data from Excel to SQL Server or Azure SQL Database
- How to Bulk Insert from XLSX file extension?
我在尝试批量插入时遇到错误:
BULK INSERT #tbl_InterCompanyUploadDetail_Staging
FROM '\SVRP03546008461D\QA\UploadTemplatewithvalidation.xlsx'
WITH (FIRSTROW = 6, FIELDTERMINATOR ='\t', ROWTERMINATOR ='\n' )
我得到的错误是:
Bulk load data conversion error (truncation) for row 6, column 2 (Oracle Company Code).
Excel中的列的数据为470,数据库列中的数据为varchar(10)。 那么错误的原因可能是什么。
将“\n”替换为“0x0a”作为 ROWTERMINATOR,然后重试。
或者也
ROWTERMINATOR = '''+cast (0x0000 as char(1))+'''
如果有效请告诉我。
同时检查 this。
我怀疑将 XLSX 文件与 BULK INSERT 一起使用。如果支持 XLSX 文件,则不需要 FIELDTERMINATOR 和 ROWTERMINATOR。
XLSX 是 zip 文件,所以我猜(但不确定)XLSX 不受支持并且您收到 t运行cation 错误,因为它将它作为纯文本文件读取并且 BULK INSERT 获取长文本直至 FIELDTERMINATOR .
为了确认,您尝试将列的长度增加到数千个字符,然后 运行 批量插入,如果出现垃圾字符,那么它会将其作为纯文本文件读取。可能是垃圾字符,可能与您在记事本或记事本++中打开相同的 xlsx 文件相同。
您无法将 XLSX 批量加载到 SQL 服务器。您可以将 XLSX 转换为制表符分隔的文本文件并批量加载。
如果这是一次性操作,我会建议先转换为文本(但要注意 Excel 如何导出某些类型,如日期和大数字)。或者您可以使用 Import/Export 向导 (https://docs.microsoft.com/en-us/sql/relational-databases/import-export/import-data-from-excel-to-sql)
如果这是您需要重复的过程,我会创建一个 SSIS 脚本。
问题
BULK INSERT
可能不适用于 xlsx 文件,请尝试将 .xlsx
文件转换为 .csv
文件以实现此 (使用 BULK INSERT
)
第一个解决方案 - 使用 OPENROWSET
尝试将 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$]')
或
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$];
参考资料
- Import/Export Excel (.Xlsx) or (.Xls) File into SQL Server
- Import data from Excel to SQL Server or Azure SQL Database
- How to Bulk Insert from XLSX file extension?