You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

将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参数适配现有文件(仅当无法修改源文件时使用)

如果实在没办法修改源文件,你可以用格式文件来精确控制每一行的解析逻辑:

  1. 创建一个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>
  1. 修改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

火山引擎 最新活动