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

如何在SSIS任务脚本中使用FireError进行调试?

SSIS脚本组件中使用FireError/FireInformation调试指南

一、核心方法基础用法

SSIS脚本组件中,ComponentMetaData对象提供的FireInformation和FireError方法,可直接向SSIS运行时日志输出调试信息或错误详情,是排查部署后问题的关键手段:

FireInformation(输出调试信息,不中断执行)

ComponentMetaData.FireInformation(
    自定义信息代码,    // 如10、20,用于区分不同日志节点
    "子组件名称",      // 如"VariableCheck"、"ApiCall",标记日志来源
    "要输出的具体信息",// 比如变量值、API响应状态等
    "",               // 帮助文件路径,留空即可
    0,                // 帮助上下文ID,设为0即可
    ref fireAgain     // 保持true,允许后续继续输出日志
);

FireError(输出错误信息,可中断任务)

ComponentMetaData.FireError(
    自定义错误代码,    // 如1001、1002,用于区分错误类型
    "子组件名称",      // 标记错误来源
    "错误详情描述",    // 比如异常信息、API失败原因
    "",               // 帮助文件路径,留空即可
    0,                // 帮助上下文ID,设为0即可
    ref cancel        // 设为true则中断任务,false则继续执行
);

二、针对你的脚本的具体修改示例

以下是基于你提供的脚本,添加调试日志的关键修改点:

1. 提前声明类级变量(方便跨方法访问)

在ScriptMain类顶部添加变量,让PostExecute也能访问循环和标记信息:

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    // 类级变量,用于跨方法传递调试数据
    private string CurrentMaxMarker;
    private int LoopIteration;
    private bool fireAgain = true;

    // 原有PreExecute、PostExecute等方法...
}

2. 变量初始化阶段添加日志(验证服务器变量配置)

在CreateNewOutputRows方法的变量赋值后,添加日志确认服务器上的变量是否正确:

string baseurl = Convert.ToString(Variables.strHPBaseUrl);
string startMarker = Convert.ToString(Variables.intMaxMarker);
string secret = Convert.ToString(Variables.strHPSecret);
string key = Convert.ToString(Variables.strHPKey);
string limit = Convert.ToString(Variables.intLimit);
int maxLoopIterations = Variables.intMaxLoopIterations;

// 输出变量配置,确认服务器环境与本地一致
ComponentMetaData.FireInformation(20, "VariableCheck", $"BaseUrl: {baseurl}", "", 0, ref fireAgain);
ComponentMetaData.FireInformation(20, "VariableCheck", $"StartMarker: {startMarker}, Limit: {limit}", "", 0, ref fireAgain);
ComponentMetaData.FireInformation(20, "VariableCheck", $"MaxLoopIterations: {maxLoopIterations}", "", 0, ref fireAgain);

// 初始化类级变量
LoopIteration = 0;
CurrentMaxMarker = startMarker;

3. API调用与数据解析阶段添加日志

在API响应成功后,添加日志确认数据接收和解析情况:

if (response.IsSuccessStatusCode)
{
    ComponentMetaData.FireInformation(30, "ApiResponse", $"API调用成功,状态码:{(int)response.StatusCode}", "", 0, ref fireAgain);
    
    Stream a = response.Content.ReadAsStreamAsync().Result;
    StreamReader Reader = new StreamReader(a, Encoding.Default);
    string Html = Reader.ReadToEnd();
    a.Close();
    
    ComponentMetaData.FireInformation(30, "ApiResponse", $"返回原始数据长度:{Html.Length}字符", "", 0, ref fireAgain);
    
    JavaScriptSerializer js = new JavaScriptSerializer();
    List<JobContext> Jobs = js.Deserialize<List<JobContext>>(Html);
    ComponentMetaData.FireInformation(30, "DataParsing", $"解析出{Jobs.Count}条Job记录", "", 0, ref fireAgain);
    
    // 原有循环处理Job的代码...
}

4. 错误分支添加FireError

在API响应失败和全局异常捕获分支,添加错误日志:

else // API响应失败
{
    bool cancel = false; // 设为true会中断任务,根据需求调整
    ComponentMetaData.FireError(1001, "ApiError", $"API调用失败:状态码{(int)response.StatusCode},原因:{response.ReasonPhrase}", "", 0, ref cancel);
    
    ErrorBuffer.AddRow();
    ErrorBuffer.ErrorMessage = "Status code is unsuccessful";
    ErrorBuffer.ErrorMessageStacktrace = SubstringStringByLength(response.ReasonPhrase, 4000);
}
catch (Exception e) // 全局异常捕获
{
    bool cancel = false;
    ComponentMetaData.FireError(1002, "GeneralError", $"执行出错:{e.Message}", "", 0, ref cancel);
    ComponentMetaData.FireError(1003, "GeneralError", $"堆栈信息:{e.StackTrace}", "", 0, ref cancel);
    
    ErrorBuffer.AddRow();
    ErrorBuffer.ErrorMessage = SubstringStringByLength(e.Message.ToString(), 950);
    ErrorBuffer.ErrorMessageStacktrace = SubstringStringByLength(e.StackTrace.ToString(), 4000);
}

5. PostExecute阶段输出最终统计

修改PostExecute方法,输出任务完成后的关键信息:

public override void PostExecute()
{
    base.PostExecute();
    ComponentMetaData.FireInformation(50, "PostExecute", $"任务执行完成,最终Marker:{CurrentMaxMarker},循环次数:{LoopIteration}", "", 0, ref fireAgain);
}

三、查看服务器上的调试日志

部署后需确保SSIS包的日志配置正确:

  • 打开SSIS包的日志配置,选择SQL Server或文件作为日志提供方
  • 勾选OnInformation和OnError事件
  • 运行包后,查看对应日志存储位置:
    • 若选SQL Server,日志默认存在msdb.dbo.sysssislog表
    • 若选文件,查看指定的日志文件路径

四、常见部署问题排查方向

结合调试日志重点排查:

  • 服务器上的SSIS变量值是否与本地一致(如API地址、密钥)
  • 服务器是否能访问目标API(防火墙、代理、网络权限)
  • 服务器.NET环境是否支持TLS1.2(你的脚本已设置,但需确认环境兼容性)
  • 脚本组件是否有数据库写入权限、API访问权限

内容的提问来源于stack exchange,提问作者MSH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:15:42