Azure SQL执行BULK INSERT报错但本地SQL Server运行正常
问题描述
将CSV文件从Blob存储直接加载到Azure SQL实例时出现报错:已正确配置凭证并可正常访问文件,但执行BULK INSERT时在第3128行失败;相同文件和配置在本地SQL Server中可完全正常执行。
执行的BULK INSERT语句:
BULK INSERT dbo.this_is_a_table FROM 'transformed/this_is_a_csv.csv' WITH ( DATA_SOURCE = 'this_is_a_blob_storage_data_source' ,FORMAT = 'CSV' ,FIELDTERMINATOR = '|' ,FIELDQUOTE = '"' ,ROWTERMINATOR = '0x0a' ,BATCHSIZE=100000 ,TABLOCK ,FIRSTROW = 2 ,CODEPAGE = '65001' )
已尝试的操作:
- 将
FORMAT改为DATAFILETYPE = 'char' - 更换
ROWTERMINATOR
以上操作均未解决问题。
报错信息:
Failed to execute query. Error: Bulk load failed due to invalid column
value in CSV data file transformed/this_is_a_csv.csv in row 3128,
column 10. The OLE DB provider "BULK" for linked server "(null)"
reported an error. The provider did not give any information about the
error.
Cannot fetch a row from OLE DB provider "BULK" for linked
server "(null)".
补充信息:
- 设置
MAXROW=3127时可正常加载数据 - 检查CSV第3128行未发现明显异常,格式与其他行基本一致
示例数据:
"MANDT"|"EBELN"|"BUKRS"|"BSTYP"|"BSART"|"BSAKZ"|"LOEKZ"|"STATU"|"AEDAT"|"ERNAM"|"LIFNR"|"EKORG"|"WAERS"|"BEDAT"|"FRGGR"|"FRGSX"|"FRGKE"|"FRGZU"|"FRGRL"|"ABSGR"|"PROCSTAT" "100"|"4620739302"|"1000"|"F"|"UB"|""|""|"L"|"20230118"|"84HD937J3J392H371842CAZEF91374923HDTAZ32"|"0001000001"|"AB01"|"USD"|"20230118"|"A1"|"S1"|"F"|"XX"|""|"00"|"05" "100"|"5729302783"|"1000"|"F"|"UB"|""|""|"L"|"20230118"|"84HD937J3J392H371842CAZEF91374923HDTAZ32"|"0001000002"|"AB01"|"USD"|"20230118"|"A1"|"S1"|"F"|"XX"|""|"00"|"05" "100"|"5720562944"|"1000"|"F"|"UB"|""|""|"L"|"20230118"|"84HD937J3J392H371842CAZEF91374923HDTAZ32"|"0001000003"|"AB01"|"USD"|"20230118"|"A1"|"S1"|"F"|"XX"|""|"00"|"05" "100"|"8401817494"|"1000"|"F"|"UB"|""|""|"L"|"20230118"|"84HD937J3J392H371842CAZEF91374923HDTAZ32"|"0001000004"|"AB01"|"USD"|"20230118"|"A1"|"S1"|"F"|"XX"|""|"00"|"05"
排查与解决方法
- 检查第3128行的隐藏字符:用Notepad++等编辑器打开文件,启用「显示所有字符」功能(视图->显示符号->显示所有字符),查看该行是否包含不可见字符(如
0x0d回车符、零宽度空格、非UTF-8特殊字符)。Azure SQL对字符编码的校验比本地SQL Server更严格,本地可忽略的隐藏字符可能在云端触发报错。 - 验证目标表列定义:确认第10列(
ERNAM)的数据类型长度是否足够。本地SQL Server可能允许隐式截断,但Azure SQL会因长度不足直接报错。比如ERNAM定义为VARCHAR(40),但该行实际值超过40字符就会触发错误。 - 逐行加载测试:修改
BATCHSIZE=1单独加载第3128行,或把该行提取成小CSV文件单独测试,排除上下文干扰,明确报错原因。 - 调整FIELDQUOTE写法:将
FIELDQUOTE = '"'改为FIELDQUOTE = '"',部分场景下转义写法在Azure SQL中可能解析异常。 - 添加ERRORFILE参数:在
WITH子句中加入ERRORFILE = 'transformed/error_log.txt',让Azure SQL输出详细错误行内容,便于定位具体值的问题,注意确保Blob存储对应路径有写入权限。 - 统一换行符格式:即使设置了
ROWTERMINATOR = '0x0a',如果第3128行是Windows格式换行符0x0d0a,其他行是Unix格式0x0a,Azure SQL可能无法正确识别行边界导致列解析错位。可将文件统一转换为Unix格式后再测试。 - 用OPENROWSET替代BULK INSERT:尝试使用
OPENROWSET加载数据,可能获得更详细的报错信息,示例语句:
SELECT * INTO dbo.test_table FROM OPENROWSET( BULK 'transformed/this_is_a_csv.csv', DATA_SOURCE = 'this_is_a_blob_storage_data_source', FORMAT = 'CSV', FIELDTERMINATOR = '|', FIELDQUOTE = '"', ROWTERMINATOR = '0x0a', FIRSTROW = 2, CODEPAGE = '65001' ) AS data;
内容的提问来源于stack exchange,提问作者fschopper
相关产品推荐
相关产品推荐

