SSIS作业中如何将多任务状态及通知链接汇总合并为单封邮件?
实现方案
给你两种经过生产验证的落地方式,可根据你的场景选择:
方案1:SSIS变量+脚本任务(轻量无依赖)
你之前对变量的不好印象大概率是早年SSIS版本的兼容性问题,2016及以后版本的变量对复杂类型支持已经非常稳定,适合不需要留存历史执行日志的场景:
- 包级别新增3个变量:
- Object类型的
TaskResults:存储每个任务的名称、执行状态、生成的资源链接 - String类型的
EmailBody:存储最终拼接的邮件正文,长度设为最大值 - String类型的
ExecutionGUID:默认绑定系统变量@[System::ExecutionInstanceGUID],用于标记单次执行实例
- Object类型的
- 每个业务任务(数据下载、报表生成等)的成功/失败分支后,各接一个微型脚本任务,脚本内仅做数据追加操作:将当前任务名、状态(成功/失败)、如果有生成的资源链接一并写入
TaskResults变量,注意提前给脚本任务开放对应变量的读写权限 - 所有业务任务都通过「完成」优先约束连接到最终的汇总脚本任务,在该任务内遍历
TaskResults的所有记录,按照你预期的格式拼接为HTML正文,链接直接写为<a href="链接地址">链接地址</a>格式,状态需要加粗的用<strong>标签包裹 - 最后调用发送邮件任务,将
EmailBody设为邮件正文,开启HTML格式选项即可发送
方案2:TSQL日志表(可回溯更稳定)
适合需要留存执行历史、任务量较多的生产场景,也就是你之前想到的方案,是企业级SSIS作业的常用实现:
- 提前在业务库/日志库建SSIS执行日志表,参考表结构:
CREATE TABLE SSIS_Task_Log ( LogID INT IDENTITY(1,1) PRIMARY KEY, ExecutionGUID UNIQUEIDENTIFIER NOT NULL, TaskName NVARCHAR(200) NOT NULL, ExecuteStatus NVARCHAR(10) NOT NULL, ResourceLink NVARCHAR(500) NULL, ExecuteTime DATETIME DEFAULT GETDATE() )
- 每个业务任务的成功/失败分支后,各接一个执行SQL任务,插入对应日志记录:成功就插入
成功状态,有资源链接就同步写入ResourceLink字段 - 所有任务执行完成后,执行SQL查询语句,筛选本次
ExecutionGUID对应的所有日志,用FOR XML PATH语法直接拼接成你需要的HTML格式列表,写入EmailBody变量 - 后续发邮件逻辑和方案1一致,该方案额外支持后续回溯任意批次的执行详情,排查问题更方便
注意事项
- 发送邮件时必须开启HTML格式,否则加粗、链接样式不会生效
- 如果邮件内容较长,注意把字符串变量的长度设置为最大值,避免内容被截断

内容的提问来源于stack exchange,提问作者fdkgfosfskjdlsjdlkfsf
相关产品推荐
相关产品推荐

