如何让SSIS主包在指定组件失败时仍返回成功状态
解决SSIS包中关键/非关键容器的失败状态控制问题
核心需求回顾
- 关键容器(Sequence Container 1、2)失败时,整个SSIS包及SQL Server Agent作业必须标记为失败,且保留完整的失败记录
- 指定的非关键容器失败时,流程需继续执行,最终包返回成功状态
- 不可将Sequence Container 3的
MaximumErrorCount设为0,否则会丢失关键容器的失败记录
方案1:通过容器属性配置错误传递(优先推荐)
利用SSIS原生的错误传递控制,让非关键容器的失败不向上影响父容器及整个包:
- 选中非关键容器,按
F4打开属性窗口 - 将属性
Propagate设置为False——该属性控制容器的错误是否向上传递到父容器。设置后,非关键容器的失败不会增加Sequence Container 3的错误计数,因此不会触发父容器或整个包的失败 - 保持关键容器(Sequence Container 1、2)的
Propagate属性为默认的True,确保它们的失败会向上传递,导致Sequence Container 3和整个包失败,进而让SQL Server Agent作业标记为失败
效果验证
- 若关键容器失败:错误向上传递,Sequence Container 3及整个包标记为失败,作业历史保留失败记录
- 若非关键容器失败:错误不向上传递,后续流程正常执行,最终包返回成功状态
方案2:脚本任务强制控制包最终状态(备选)
如果需要更复杂的判断逻辑,可通过脚本任务手动控制包的最终状态:
- 在Sequence Container 3的末尾添加一个脚本任务(确保所有容器执行完成后再运行)
- 配置脚本任务的只读变量,引入关键容器的执行状态变量(或自定义变量记录关键容器是否失败)
- 在脚本编辑器中编写逻辑(以C#为例):
// 检查关键容器的执行状态,示例逻辑需根据实际变量调整 bool isCriticalFailed = (bool)Dts.Variables["User::Seq1Failed"].Value || (bool)Dts.Variables["User::Seq2Failed"].Value; if (isCriticalFailed) { // 关键容器失败,设置包为失败状态 Dts.TaskResult = (int)Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure; } else { // 关键容器全部成功,设置包为成功状态 Dts.TaskResult = (int)Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success; } - 保持Sequence Container 3的
MaximumErrorCount为默认值,确保关键容器的失败会被捕获并记录到作业历史
注意事项
- 需提前为关键容器设置执行状态记录:比如在关键容器的
OnError事件中,将自定义变量设为True - 确保SQL Server Agent作业的步骤配置为“失败时退出”,这样包的状态会同步到作业状态
内容的提问来源于stack exchange,提问作者Łukasz
相关产品推荐
相关产品推荐

