CSV批量插入SQL Server仅导入半数数据问题排查及全量导入方案
解决BULK INSERT仅导入半数700万条CSV记录的问题
我来帮你定位问题并给出解决方案,你这个情况90%是分隔符配置错误导致的,咱们一步步拆解:
核心错误:字段分隔符与行分隔符重复
你当前的BULK INSERT语句里,FIELDTERMINATOR = '0x0a'(也就是换行符),同时ROWTERMINATOR = '\n'(同样是换行符)——这会让SQL Server彻底搞不清哪部分是字段、哪部分是行。
如果你的CSV是单字段文件(每条记录就是一行内容),那根本不需要指定FIELDTERMINATOR;如果是多字段CSV,你应该用逗号(,)、制表符(\t)这类实际的字段分隔符,而不是换行符。这种错误配置会导致大量记录被误判为无效行,最终只导入了一部分。
修正后的BULK INSERT语句
情况1:CSV是单字段(每条记录占一行)
直接移除错误的FIELDTERMINATOR配置即可:
BULK INSERT *Table_Name* FROM 'file path' WITH ( FIRSTROW = 1, -- CSV无表头,这个配置是对的 ROWTERMINATOR = '\n', ERRORFILE = '*error file path*', TABLOCK, MAXERRORS = 0 -- 强制显示所有错误,方便排查 )
情况2:CSV是多字段(比如用逗号分隔)
把FIELDTERMINATOR替换成你实际的字段分隔符(这里以逗号为例):
BULK INSERT *Table_Name* FROM 'file path' WITH ( FIRSTROW = 1, FIELDTERMINATOR = ',', -- 替换为你CSV实际的字段分隔符 ROWTERMINATOR = '\n', ERRORFILE = '*error file path*', TABLOCK, MAXERRORS = 0 )
额外排查与优化步骤
- 查看错误文件:优先打开你指定的
ERRORFILE路径,里面会详细记录导入失败的行和具体原因(比如字段过长、格式错误),这是最快定位问题的方式。 - 统一行结尾格式:如果CSV文件混合了Windows(
\r\n)和Unix(\n)换行符,统一改成\r\n,并把ROWTERMINATOR设为'\r\n'。 - 检查字段长度:你的表字段
varchar(50)如果不足以容纳CSV中的内容,会导致记录被截断或报错跳过,建议根据实际数据调整长度(比如改成varchar(255)或更大)。 - 权限验证:确保SQL Server服务账号有CSV文件所在路径的读取权限,权限不足也可能导致部分记录无法读取。
- 编码适配:如果CSV是UTF-8编码,在SQL Server 2016及以上版本可以添加
CODEPAGE = '65001'参数,避免乱码或导入失败。
内容的提问来源于stack exchange,提问作者Bain-27
相关产品推荐
相关产品推荐

