SSIS加载CSV至SQL Server报错:列分隔符未找到及引号未移除
解决CSV加载到SQL Server的“未找到列的列分隔符”问题
一、SSIS平面文件连接管理器配置修正
- 确认文本限定符全局+列级同步设置:在平面文件连接管理器的「常规」页签指定文本限定符为英文双引号
"后,切换到「高级」页签,检查每一列的「文本限定符」属性是否继承了全局设置(或手动设置为")。仅设置全局但列级未同步是引号残留的常见原因。 - 清理分隔符后多余空格:你的CSV中存在
"James,good", manager这类逗号后带空格的格式,会导致解析器误判分隔符。优先清理CSV文件,保证分隔符后无多余空格;若无法修改CSV,可将列分隔符设置为,(逗号加空格)。 - 验证预览结果:在连接管理器的「预览」页签确认列拆分正确,
fullname列的双引号已被自动移除。若仍有引号,检查是否误设为全角引号(需确保是英文双引号")。
二、T-SQL BULK INSERT脚本加载方案
1. SQL Server 2017及以上版本(支持FIELDQUOTE参数)
先创建目标表:
CREATE TABLE Employee ( Id INT, fullname VARCHAR(100), role VARCHAR(50), date DATE );
执行BULK INSERT:
BULK INSERT Employee FROM 'C:\your_file_path\data.csv' WITH ( FIRSTROW = 2, -- 跳过表头行 FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIELDQUOTE = '"', -- 指定文本限定符 TABLOCK );
2. SQL Server 2016及以下版本(需使用格式化文件)
创建XML格式化文件(例如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="10"/> <FIELD ID="2" xsi:type="CharTerm" TERMINATOR='",' MAX_LENGTH="100" QUOTE="""/> <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="50"/> <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="10"/> </RECORD> <ROW> <COLUMN SOURCE="1" NAME="Id" xsi:type="SQLINT"/> <COLUMN SOURCE="2" NAME="fullname" xsi:type="SQLVARCHAR"/> <COLUMN SOURCE="3" NAME="role" xsi:type="SQLVARCHAR"/> <COLUMN SOURCE="4" NAME="date" xsi:type="SQLDATE"/> </ROW> </BCPFORMAT>
通过格式化文件执行加载:
BULK INSERT Employee FROM 'C:\your_file_path\data.csv' WITH ( FIRSTROW = 2, FORMATFILE = 'C:\your_file_path\format.xml', TABLOCK );
三、常见坑点排查
- 确认CSV编码为SQL Server支持的格式(如ANSI或UTF-8),若为UTF-8带BOM,需在SSIS中设置编码为UTF-8,或在BULK INSERT中添加
CODEPAGE='65001'参数。 - 检查行尾格式:若CSV实际使用
\n而非{CR}{LF},需同步修改行分隔符配置。
内容的提问来源于stack exchange,提问作者Chandan007
相关产品推荐
相关产品推荐

