You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSIS脚本组件源:如何添加捕获错误列及描述的错误输出

在SSIS源类型脚本组件中实现带errorColumnName和errorDescription的错误输出

嘿,这个问题我之前也帮同行捋过——源组件确实因为没有转换组件那样的ProcessInput方法,没法直接套用现成的错误输出逻辑,但咱们完全可以手动模拟实现这套功能,步骤其实挺明确的:

第一步:配置错误输出的元数据

  1. 打开脚本组件编辑器,切换到输入和输出选项卡
  2. 在输出面板右键,选择添加输出,把输出类型改成错误输出
  3. 给这个错误输出起个好记的名字(比如ErrorOutput),然后把你需要保留的源数据列都添加进去
  4. 额外添加四个字段:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:05:15