You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BULK INSERT导入含分隔符的CSV数据遇错求助

解决思路

方法1:添加QUOTE参数指定字段包裹符

你的CSV里包含分隔符的字段是用双引号包裹的,BULK INSERT默认不会识别这种带引号的字段,需要显式指定QUOTE参数,告诉它双引号是字段的包裹符号,内部的|会被当作字段内容而非分隔符。修改后的SQL语句如下:

BULK INSERT temp.table
FROM 'test.csv' -- 建议使用完整文件路径,例如'C:\data\test.csv'
WITH
(
    FIRSTROW=2,
    FIELDTERMINATOR='|', 
    ROWTERMINATOR='\n',
    QUOTE='"' -- 指定双引号为字段包裹符
);

如果你的CSV是Windows系统生成的,行终止符可能是\r\n,可以把ROWTERMINATOR改成'\r\n',避免行拆分错误。

方法2:使用格式化文件(FORMATFILE)精确控制解析规则

如果方法1仍有问题,或者CSV格式更复杂(比如部分字段带引号、部分不带),可以创建XML格式化文件逐列定义解析规则。

针对你的3列表头,创建format.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="255" QUOTED="YES"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="255" QUOTED="YES"/>
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\n" MAX_LENGTH="255" QUOTED="YES"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="A" xsi:type="SQLVARCHAR"/>
  <COLUMN SOURCE="2" NAME="B" xsi:type="SQLVARCHAR"/>
  <COLUMN SOURCE="3" NAME="C" xsi:type="SQLVARCHAR"/>
 </ROW>
</BCPFORMAT>

然后在BULK INSERT中引用这个格式化文件:

BULK INSERT temp.table
FROM 'test.csv'
WITH
(
    FIRSTROW=2,
    FORMATFILE='C:\data\format.xml' -- 替换为你的格式化文件实际路径
);

这种方式能精准控制每一列的解析逻辑,适配复杂格式的CSV。

为什么之前修改FIELDTERMINATOR='&quot;|&quot;'会报错?

你的CSV表头是A|B|C,没有用双引号包裹,当把分隔符设为"|"时,BULK INSERT在表头行找不到匹配的分隔符,会把整行内容当成第一列的值,从而触发“列过长”的错误。

内容的提问来源于stack exchange,提问作者Dana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:57:27