SSIS错误输出未保留实际出错值,如何配置使其正确记录?
SSIS错误文件保留实际出错值的解决方案
核心问题根源
SSIS通过ADO.NET MySQL源读取存储过程时,仅采样少量行定义元数据,导致列的精度/长度与实际数据不匹配(比如定义为Numeric(4,2)却遇到243.32),触发源端错误,且错误输出默认将出错值替换为NULL。
解决方法
1. 强制元数据匹配实际定义
- 直接修改ADO.NET源的元数据:在SSIS设计器中,右键ADO.NET源→显示高级编辑器→输入和输出属性,找到对应列,手动设置
数据类型、精度、小数位数为存储过程返回的实际值(比如将Numeric(4,2)改为Numeric(5,2)以容纳243.32)。 - 提前定义结果集:如果存储过程返回固定结构,可在MySQL中创建临时表或视图,明确指定列的精度和长度,让SSIS读取该对象获取准确元数据,再关联存储过程逻辑。
2. 绕过源端错误捕获,改用数据流内验证
- 调整错误处理策略:将ADO.NET源的错误输出设置为重定向行,但先确保源端元数据足够宽松(比如将数值列设为更大的精度,文本列设为足够长度),让所有数据先进入数据流。
- 添加数据转换组件:在数据流中插入数据转换组件,对列进行强制类型转换(比如将宽松数值转换为目标所需的
Numeric(4,2)),此时将转换组件的错误输出指向平面文件,就能捕获实际出错值。
3. 自定义错误捕获逻辑
- 使用脚本组件:在数据流中添加脚本组件(作为转换),手动校验每一行数据的精度/长度,当检测到不符合要求的值时,将该行数据(包含出错值)写入自定义错误输出,再连接到平面文件目标。
示例C#脚本片段(校验数值列):// 假设列名为MyNumericCol,目标精度5,小数位2 decimal value = Row.MyNumericCol; if (value > 999.99 || value < -999.99) { // 输出到错误行 ErrorBuffer.AddRow(); ErrorBuffer.MyNumericCol_Error = value; ErrorBuffer.ErrorDescription = "数值超出Numeric(5,2)范围"; // 其他列同步复制 ErrorBuffer.OtherCol = Row.OtherCol; } else { // 正常输出到目标行 Row.DirectRowToOutput0(); }
4. 修改SSIS元数据采样行为
- 在项目属性中调整元数据采样行数:右键SSIS项目→属性→配置属性→调试,找到
DefaultMaxRowsForSchemaDetection,设置为足够大的值(比如10000),让SSIS读取更多行来获取准确元数据,但注意这会增加初始化时间。
流程优化建议
- 先统一所有站点的存储过程返回列的元数据,确保每个站点的同列精度、长度完全一致。
- 优先采用手动修正元数据的方式,避免采样带来的不确定性。
- 若必须保留错误捕获,改用数据流内的转换组件或脚本组件来捕获实际出错值,而非依赖源端的错误输出。
内容的提问来源于stack exchange,提问作者MBM
相关产品推荐
相关产品推荐

