将TXT文件所有列按文本导入SQL Server时遇报错求助
解决BULK INSERT CSV导入时的Msg 4879报错问题
这个问题我碰到过,核心是你的文本文件列分隔符不统一导致的,我来给你拆解下原因和解决办法:
问题根源
报错指向第二行第一列,本质是你的文本文件里列分隔符不一致:
- 表头行
Name, Zipcode用逗号分隔列 - 第二行
Person1 2630用空格分隔列
当你用FORMAT='CSV'执行BULK INSERT时,SQL Server会严格按照逗号拆分每一行的列。第二行没有逗号,就会把整行内容塞进Name列,导致Zipcode列找不到对应的值,直接触发了Msg 4879错误。
解决方案
方案1:修正源文本文件格式(最推荐)
把所有行的列分隔符统一为逗号,修改后的文件内容如下:
Name, Zipcode Person1, 2630 Person2, 2500 Person3, NA
修改完之后,直接执行你原来的BULK INSERT语句就能正常导入所有数据了。
方案2:调整BULK INSERT参数适配现有文件(仅当无法修改源文件时使用)
如果实在没办法修改源文件,你可以用格式文件来精确控制每一行的解析逻辑:
- 创建一个XML格式文件(比如存到桌面,命名为
ZipcodeFormat.xml),内容如下:
<?xml version="1.0"?> <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <RECORD> <FIELD ID="1" xsi:type="CharTerm" TERMINATOR=", " MAX_LENGTH="50"/> <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="50"/> </RECORD> <ROW> <COLUMN SOURCE="1" NAME="Name" xsi:type="SQLNVARCHAR"/> <COLUMN SOURCE="2" NAME="Zipcode" xsi:type="SQLNVARCHAR"/> </ROW> </BCPFORMAT>
- 修改
BULK INSERT语句,指定格式文件并跳过表头行:
BULK INSERT ImportFromText FROM 'C:\Users\david\Desktop\Zipcode.txt' WITH ( FORMATFILE = 'C:\Users\david\Desktop\ZipcodeFormat.xml', FIRSTROW = 2 -- 跳过第一行的表头 ); Go
另外补充个小细节:如果你的文件是Windows系统生成的,换行符可能是\r\n,可以把原语句里的ROWTERMINATOR = '\n'改成ROWTERMINATOR = '\r\n',避免出现行解析不完整的问题。
内容的提问来源于stack exchange,提问作者xhr489




