排查BULK INSERT无报错但0行受影响问题
以下是你还可以排查的几个方向:
检查文件编码:SQL Server的BULK INSERT默认使用ASCII编码,如果你的CSV是UTF-8(带/不带BOM)、UTF-16等编码,可能导致读取异常。尝试在WITH子句中指定编码,比如:
CODEPAGE = '65001' -- 对应UTF-8或者
CODEPAGE = '1252'(ANSI编码)。验证行终止符:Windows生成的CSV通常用
\r\n作为行终止符,而非\n。可以尝试修改参数为:ROWTERMINATOR = '\r\n'或者用十六进制写法避免转义问题:
ROWTERMINATOR = 0x0d0a(对应\r\n)、ROWTERMINATOR = 0x0a(对应\n)。确认SQL Server服务账户权限:执行BULK INSERT的是SQL Server服务账户(不是你的登录账户),它需要有读取目标CSV文件的权限。如果文件放在个人目录,服务账户可能无法访问,建议把文件移到公共目录(比如
C:\Temp),或者给服务账户添加该路径的读取权限。检查文件内容有效性:确认CSV文件除表头外确实存在有效数据行,没有全空的情况。打开文件手动检查,看表头之后是否有实际数据。
核对字段数量匹配度:检查表的列数和CSV每行的字段数是否完全一致。如果列数不匹配,BULK INSERT会跳过这些行。可以添加
ERRORFILE参数生成错误日志,定位具体问题:BULK INSERT dbo.common_player_info_2 FROM 'C:\PATH\common_player_info.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW = 2, ERRORFILE = 'C:\PATH\bulk_insert_errors.log' -- 生成错误日志文件 )日志会记录无法导入的行及原因。
处理带引号的字段:如果CSV中有用双引号包裹含分隔符的字段(比如
"Smith, John",25),需要在WITH子句中添加QUOTE = '"'参数,否则BULK INSERT会将整个带引号的内容识别为单个字段,导致列数不匹配进而跳过行。验证FIRSTROW参数:如果CSV的表头行实际为空,或者第一行就是数据,设置
FIRSTROW = 2会跳过唯一的数据行。可以尝试改为FIRSTROW = 1测试是否能导入数据。检查表约束:虽然字段类型设为varchar(50),但表可能存在主键、唯一约束或检查约束,导致插入行因违反约束被丢弃。默认情况下违反约束会报错,但可以检查表的约束是否与导入数据存在冲突。
内容的提问来源于stack exchange,提问作者sung

