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

SSIS:OnError事件处理完成后无法继续For Loop容器后续任务

解决SSIS包遇错后终止、无法继续执行For Loop容器的问题

核心思路

问题根源是子包执行失败触发OnError后,错误状态向上传播导致整个包终止,而非仅标记当前表任务失败。需要通过调整错误传播行为、容器及任务的失败属性,让For Loop在当前表任务修复成功后继续执行下一个表。

具体操作步骤

1. 调整子包执行任务的失败属性

在父包的For Loop容器内,找到调用子包的Execute Package Task:

  • 右键打开属性窗口,找到FailPackageOnFailure和FailParentOnFailure,都设置为False。
  • 同时设置MaximumErrorCount为合适的值(比如1,允许一次失败后通过事件处理修复)。
    这样当前子包任务失败时,不会直接让父容器或整个包终止,只会标记自身失败,触发OnError事件。

2. 在OnError事件处理程序中标记错误已处理

在事件处理程序的最后,添加一个Script Task,通过代码将当前错误标记为已处理,阻止错误继续向上传播:

  • 脚本任务中写入C#代码示例:
    bool fireAgain = true;
    Dts.Events.FireInformation(0, "Error Handled", "当前表任务已修复完成,错误已标记为处理", string.Empty, 0, ref fireAgain);
    Dts.Variables["System::Propagate"].Value = false;
    
    这里的System::Propagate变量控制错误是否向上传播,设置为false后,错误不会传到父容器或包级别,For Loop就能继续执行下一次循环。

3. 调整For Loop容器的错误处理设置

  • 打开For Loop容器的属性窗口,设置MaximumErrorCount为一个足够大的值(比如等于需要更新的表数量),允许容器内多次出现失败后仍继续执行。
  • 确保容器的FailPackageOnFailure和FailParentOnFailure都设置为False。

4. 自定义包最终状态(可选)

如果希望包最终执行状态为成功(只要所有表都处理完成,即使中间有过失败修复),可以在包的最后添加一个Script Task,手动设置包的执行结果:

Dts.TaskResult = (int)ScriptResults.Success;

这样即使中间有任务失败过,但通过事件处理修复后,包最终会显示成功状态。

验证流程

调整后执行流程应为:
T.Customers执行成功→T.Sales子包执行失败→触发OnError处理程序→修复问题后重跑T.Sales成功→错误被标记为已处理,不传播→For Loop继续执行下一个表T.Returns→所有表处理完成后包正常结束。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:28:23