使用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='"|"'会报错?
你的CSV表头是A|B|C,没有用双引号包裹,当把分隔符设为"|"时,BULK INSERT在表头行找不到匹配的分隔符,会把整行内容当成第一列的值,从而触发“列过长”的错误。
内容的提问来源于stack exchange,提问作者Dana
相关产品推荐
相关产品推荐

