SSIS脚本组件源:如何添加捕获错误列及描述的错误输出
在SSIS源类型脚本组件中实现带errorColumnName和errorDescription的错误输出
嘿,这个问题我之前也帮同行捋过——源组件确实因为没有转换组件那样的ProcessInput方法,没法直接套用现成的错误输出逻辑,但咱们完全可以手动模拟实现这套功能,步骤其实挺明确的:
第一步:配置错误输出的元数据
- 打开脚本组件编辑器,切换到输入和输出选项卡
- 在输出面板右键,选择添加输出,把输出类型改成错误输出
- 给这个错误输出起个好记的名字(比如
ErrorOutput),然后把你需要保留的源数据列都添加进去 - 额外添加四个字段:
ErrorCode:int类型(SSIS标准错误码字段)ErrorColumn:int类型(存储出错列的ID)errorColumnName:string类型(存储出错列的名称)errorDescription:string类型(存储具体的错误描述)
第二步:在脚本中准备辅助逻辑
在脚本编辑器里,先写一个辅助方法,用来把ErrorColumn的ID转换成对应的列名——因为SSIS返回的ErrorColumn是列的内部ID,不是直观的名称:
private string GetColumnNameByID(int columnID) { foreach (IDTSInputColumn100 col in this.ComponentMetaData.InputCollection[0].InputColumnCollection) { if (col.ID == columnID) { return col.Name; } } return "Unknown Column"; }
另外,记得在脚本类的顶部定义错误输出的行对象:
private ErrorOutputBuffer ErrorBuffer;
然后在PreExecute方法里初始化这个对象:
public override void PreExecute() { base.PreExecute(); ErrorBuffer = this.ErrorOutputBuffer; }
第三步:在数据生成过程中捕获错误并写入输出
源组件的核心逻辑在CreateNewOutputRows方法里,这里是你生成/读取源数据的地方。咱们用try-catch块捕获异常,然后把错误信息写入错误输出:
举个示例(假设你从某个数据源读取数据,比如CSV、数据库或者自定义API):
public override void CreateNewOutputRows() { try { // 这里是你的源数据读取逻辑,比如遍历数据源生成行 foreach (var sourceRecord in YourDataSource) { // 正常输出行的生成逻辑 Output0Buffer.AddRow(); Output0Buffer.Column1 = sourceRecord.Column1; // ...其他列赋值 // 如果某列赋值可能出错,也可以单独加try-catch捕获列级错误 try { Output0Buffer.Column2 = int.Parse(sourceRecord.Column2); } catch (Exception ex) { // 捕获列级错误,写入错误输出 ErrorBuffer.AddRow(); // 复制原数据列到错误输出 ErrorBuffer.Column1 = sourceRecord.Column1; ErrorBuffer.Column2 = sourceRecord.Column2; // ...其他原列复制 // 填充错误字段 ErrorBuffer.ErrorCode = -1073450974; // 对应SSIS的"数据转换失败"错误码,可根据情况调整 ErrorBuffer.ErrorColumn = this.ComponentMetaData.InputCollection[0].InputColumnCollection["Column2"].ID; ErrorBuffer.errorColumnName = "Column2"; ErrorBuffer.errorDescription = $"转换失败: {ex.Message}"; } } } catch (Exception ex) { // 捕获全局级别的错误,比如数据源连接失败 ErrorBuffer.AddRow(); // 这里如果没有原数据可以复制,就留空或者标记 ErrorBuffer.ErrorCode = -1073450975; // 自定义或使用SSIS标准错误码 ErrorBuffer.ErrorColumn = 0; // 全局错误没有具体列,填0 ErrorBuffer.errorColumnName = "Global Error"; ErrorBuffer.errorDescription = $"数据源读取失败: {ex.Message}"; } }
关键注意点
- 错误码可以使用SSIS的标准错误码(比如
0xC0047022对应组件错误,转换成int就是-1073450974),也可以自定义负数错误码 - 如果是列级错误,一定要准确获取对应列的ID,这样才能正确映射到列名
- 错误输出的行必须先调用
AddRow(),才能赋值各个字段
内容的提问来源于stack exchange,提问作者J Weezy
相关产品推荐
相关产品推荐

