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
相关产品推荐
相关产品推荐

