在SSIS中的文件系统任务之后进行分支而不会使程序包失败

时间:2009-01-29 20:23:18

标签: ssis error-handling

如果文件系统任务(例如重命名)失败,例如文件不存在,则SSIS会将此视为错误。这意味着整个包失败了。我可以通过使用脚本任务或将包的最大错误设置为多个来解决问题。将程序包的最大错误设置为多个错误的问题是,如果程序包中的其他位置发生错误,程序包将不会失败。

那么有没有办法以某种方式吞下错误,仍然能够根据文件系统任务的成功或失败进行分支?我尝试将文件任务粘贴到ForceExecutionResult设置为Success的序列容器中,但是程序包仍然无法说明达到最大错误计数。

9 个答案:

答案 0 :(得分:10)

这是一个可能的选择。您可以通过将文件系统任务后的Precedence Constraint更改为Completion来实现问题中提到的要求。以下示例显示了如何完成此操作。该示例是使用SSIS 2008 R2创建的,但也适用于以前的版本。

分步流程:

  1. 创建一个SSIS包并创建两个变量,如屏幕截图# 1 所示。将一些不存在的文件路径值分配给变量。

  2. 在包的控制流选项卡上,放置文件系统任务,脚本任务和数据流任务,如屏幕截图# 2 所示。脚本任务和数据流任务在这里是假的,任务没有配置为执行任何操作。

  3. 配置文件系统任务,如屏幕截图# 3 所示。

  4. 屏幕截图# 4 显示程序包执行,正如预期的那样,文件系统任务失败,因为文件路径不存在。此外,由于错误,程序包在文件系统任务之后停止执行任务。

  5. 右键点击File System TaskScript Task之间的优先约束箭头,然后选择完成,如屏幕截图# 5 所示。箭头应从绿色颜色变为蓝色颜色。

  6. 屏幕截图# 6 显示优先约束更改后的包执行。文件系统任务仍然失败,但其他任务继续执行。 Earlier,条件是仅在文件系统任务成功时执行脚本任务。 Now,条件是在文件系统任务完成执行后执行脚本任务(无论成功或失败)。

  7. 如果您希望包装根据成功/失败完全采用两种不同的路径。您可以执行此操作,如屏幕截图# 7 和# 8 所示。红色箭头表示路径将在文件系统任务的失败上进行,绿色箭头表示将在成功执行文件系统任务时执行路径。在屏幕截图# 7 中显示的包执行之前,我在路径C:\temp\Source.txt中创建了一个文件。程序包执行后,文件被重命名,路径不再存在。因此,软件包失败,如屏幕截图# 8

  8. 所示

    希望有所帮助。

    屏幕截图#1:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8

答案 1 :(得分:2)

检查FileSystem任务的FailPackageOnFailure和FailParentOnFailure属性,并确保它们设置为False。另外,增加包的MaximumErrorCount属性。

此组合将允许任务失败并且程序包仍能成功完成。

答案 2 :(得分:1)

使文件系统任务的属性“强制执行结果”成功。

答案 3 :(得分:0)

我遇到了这个问题,我总是使用脚本任务。我不认为有更好的解决方案。

答案 4 :(得分:0)

我没有尝试使用FS任务,但它适用于数据流...如何将文件系统任务包装在序列容器中...如果步骤失败,容器失败,您可以简单地输出容器到成功/失败的路径......

答案 5 :(得分:0)

您可以在连接上使用约束。 右键单击SSIS组件之间的连接箭头,您可以指定

成功/失败并重定向。

答案 6 :(得分:0)

prashant_sp是正确的答案,您只需通过选择“成功时”工作流程优先约束来继续无条件地继续下一个任务,但是“重定向”将始终继续,即使您的FS任务失败(文件夹不存在等等)

亲切的问候

答案 7 :(得分:0)

在“优先约束”连接器上使用表达式和约束组合。 始终从您之前的任务返回成功(可能是查找文件的脚本),如果找到文件,则设置变量。在“优先约束”的表达式中检查变量值并返回true或false。如果表达式的计算结果为false,则程序包将不会继续,但您不会看到任何错误。 - Mayukh

答案 8 :(得分:0)

我知道这是一个老问题,但它可能有助于寻找答案的人。

结合user756519非常好的答案,停止传播错误可防止程序包失败。这意味着您可以有效地将故障用作分支,而无需担心它会破坏您的包裹。

有关详细信息,请参阅cfrag' s answer on this question。该答案指向this blog entry,它解释了如何为OnError事件处理程序设置传播变量(制作事件处理程序,打开变量视图,显示系统变量,将Propogate设置为false)。