如何忽略pipe delimited CSV文件中因添加逗号产生的双引号?
解决BULK INSERT导入竖线分隔CSV时的双引号问题
针对你遇到的导入后首尾出现双引号、原有双引号变为连续两个的问题,有以下几种解决方式:
1. 使用格式化文件(推荐)
SQL Server的BULK INSERT支持通过XML格式化文件指定字段的引号封装规则,自动处理双引号:
步骤1:创建格式化文件
根据你的CSV列数,生成对应的XML格式化文件(假设CSV有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="|" QUOTE="""/> <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|" QUOTE="""/> <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\n" QUOTE="""/> </RECORD> <ROW> <COLUMN SOURCE="1" NAME="Column1" xsi:type="SQLNVARCHAR"/> <COLUMN SOURCE="2" NAME="Column2" xsi:type="SQLNVARCHAR"/> <COLUMN SOURCE="3" NAME="Column3" xsi:type="SQLNVARCHAR"/> </ROW> </BCPFORMAT>
- 每个
<FIELD>节点的QUOTE="""表示字段由双引号封装 - 调整
ID、TERMINATOR和<COLUMN>节点数量,匹配你的实际列数和字段类型
步骤2:修改BULK INSERT语句
在WITH子句中添加FORMATFILE参数,指定格式化文件路径:
BULK INSERT #temp1 FROM '\\as03\\AppData\\PipeDelimited.csv' WITH ( FIRSTROW = 2 , FIELDTERMINATOR ='|' , ROWTERMINATOR='\n' , ERRORFILE ='\\as03\\AppData\\ErrorFiles\\PipeDelimited.csv' , CODEPAGE = '65001' , MAXERRORS = 99999999 , FORMATFILE = '\\as03\\AppData\\format.xml' -- 替换为你的格式化文件路径 )
执行后,SQL Server会自动去除字段首尾的双引号,并将连续的双引号("")还原为单个双引号。
2. 导入后手动清理数据
如果不想使用格式化文件,可以先将数据导入临时表,再通过字符串函数清理双引号:
方式1:更新临时表数据
UPDATE #temp1 SET Col1 = REPLACE(TRIM('"' FROM Col1), '""', '"'), Col2 = REPLACE(TRIM('"' FROM Col2), '""', '"'), -- 依次处理所有列 ColN = REPLACE(TRIM('"' FROM ColN), '""', '"');
方式2:插入目标表时直接处理
INSERT INTO YourTargetTable (Col1, Col2, ColN) SELECT REPLACE(TRIM('"' FROM Col1), '""', '"'), REPLACE(TRIM('"' FROM Col2), '""', '"'), -- 依次处理所有列 REPLACE(TRIM('"' FROM ColN), '""', '"') FROM #temp1;
TRIM('"' FROM 列名):去除字段首尾的双引号REPLACE(..., '""', '"'):将连续的双引号替换为单个双引号
3. 从根源避免Excel添加引号
问题本质是Excel保存CSV时,会自动给包含逗号、换行或双引号的字段添加双引号,并将原有双引号转义为两个。如果可以跳过Excel处理,直接用Notepad++等文本编辑器打开竖线分隔文件,手动添加逗号后保存,就能避免自动添加引号的问题。
内容的提问来源于stack exchange,提问作者Gagan Maharjan
相关产品推荐
相关产品推荐

