如何在SSIS平面文件源中跳过列数不足的错误行?
解决SSIS导入CSV时跳过列数不匹配行的问题
我之前处理过完全相同的场景——导入固定17列的CSV时总有几行列数不对,导致包直接失败。单纯设置列忽略没用,因为SSIS是先校验整行的列数再处理列。下面是几个亲测有效的方案:
方案一:利用平面文件源的错误输出重定向(最简单)
这是SSIS原生的错误处理方式,不需要写代码:
- 打开平面文件源编辑器,切换到「错误输出」选项卡
- 在列表里找到对应错误(通常是代码
0xC0202092,描述为“列数与预期列数不匹配”) - 把该错误的「处理方式」从默认的失败组件改成重定向行
- 接着在数据流里添加一个组件(比如「行计数」或者「平面文件目标」),连接平面文件源的「错误输出」端口到这个组件
- 这样执行包时,列数不对的行会被自动转到错误输出流,主数据流正常执行,包不会失败
方案二:用脚本组件预处理CSV(灵活处理复杂情况)
如果你的CSV有特殊格式(比如字段带引号包裹、包含逗号),平面文件源的错误输出可能不够灵活,这时候可以用脚本组件自定义过滤逻辑:
- 删除原来的平面文件源,添加一个脚本组件,选择「源」类型
- 在脚本编辑器里,先添加17个输出列(和目标表的列对应)
- 编写C#代码读取CSV,过滤列数不符的行:
using System.IO; using Microsoft.VisualBasic.FileIO; // 需要添加Microsoft.VisualBasic引用 public override void CreateNewOutputRows() { string csvPath = Variables.CSVFilePath; // 提前定义好存储CSV路径的变量 using (TextFieldParser parser = new TextFieldParser(csvPath)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); parser.HasFieldsEnclosedInQuotes = true; // 处理带引号的字段 parser.ReadLine(); // 如果有表头,跳过第一行 while (!parser.EndOfData) { try { string[] fields = parser.ReadFields(); if (fields != null && fields.Length == 17) { Output0Buffer.AddRow(); // 给每个输出列赋值,比如: Output0Buffer.Col1 = fields[0]; Output0Buffer.Col2 = fields[1]; // ... 依次对应到第17列 } } catch (MalformedLineException ex) { // 可选:记录错误行到日志变量 Variables.ErrorLog += $"Invalid line at {parser.LineNumber}: {ex.Message}{Environment.NewLine}"; } } } }
- 把脚本组件的输出连接到后续的转换/目标组件即可
额外注意事项
- 确认你的平面文件连接管理器里的列数是17,分隔符设置和CSV一致(比如不要把分号当成逗号)
- 如果CSV有表头,确保表头行的列数是17,否则平面文件源会默认列数不对
- 可以在包的「事件处理程序」里添加「OnError」事件,记录错误详情到日志表,方便后续排查
内容的提问来源于stack exchange,提问作者arcee123
相关产品推荐
相关产品推荐

