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

在SSIS中的文件系统任务之后进行分支,而不会使包失败,ssis,error-handling,Ssis,Error Handling,如果文件系统任务(如重命名)失败,例如,如果文件不存在,SSIS会将此视为错误。这意味着整个包都失败了。我可以通过使用脚本任务或将包的最大错误设置为多个来绕过它。将包的最大错误设置为多个错误的问题在于,如果包中的其他地方发生错误,则包不会在应该失败时失败 那么,是否有任何方法能够以某种方式消除错误,并且仍然能够根据文件系统任务的成功或失败进行分支呢?我尝试将文件任务粘贴到序列容器中,并将ForceExecutionResult设置为Success,但软件包仍然无法显示已达到最大错误计数。我遇到了

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


那么,是否有任何方法能够以某种方式消除错误,并且仍然能够根据文件系统任务的成功或失败进行分支呢?我尝试将文件任务粘贴到序列容器中,并将ForceExecutionResult设置为Success,但软件包仍然无法显示已达到最大错误计数。

我遇到了这个问题,我一直使用脚本任务。我认为没有更好的解决办法了

我没有在FS任务中尝试过这一点,但它在数据流中运行良好。。。将文件系统任务包装到序列容器中如何。。。如果步骤失败,则容器失败,您可以简单地从容器输出到成功/失败路径……

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


这种组合将允许任务失败,并且包仍能成功完成。

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


成功/失败和重定向

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


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

这里有一个可能的选择。通过将文件系统任务后的
优先约束更改为
完成
,可以实现问题中提到的要求。下面的示例显示了如何做到这一点。该示例是使用SSIS 2008 R2创建的,但对以前的版本也适用

逐步过程:

  • 创建SSIS包并创建两个变量,如屏幕截图#1所示。为变量指定一些不存在的文件路径值

  • 在包的“控制流”选项卡上,放置文件系统任务、脚本任务和数据流任务,如屏幕截图2所示。脚本任务和数据流任务在这里是虚拟的,并且这些任务没有配置为执行任何操作

  • 如屏幕截图3所示配置文件系统任务

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

  • 右键单击
    文件系统任务
    脚本任务
    之间的优先约束箭头,然后选择完成,如屏幕截图#5所示。箭头应从绿色变为蓝色

  • 屏幕截图#6显示优先约束更改后的包执行情况。文件系统任务仍然失败,但其他任务继续执行
    前面的
    ,条件是仅当文件系统任务成功时才执行脚本任务
    现在
    ,条件是在文件系统任务完成执行后执行脚本任务(无论成功与否)

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

  • 希望有帮助

    屏幕截图#1:

    截图#2:

    屏幕截图#3:

    屏幕截图#4:

    屏幕截图#5:

    屏幕截图#6:

    截图#7:

    截图#8:


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

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

    结合user756519的非常好的回答,停止错误传播可以防止包失败。这意味着您可以有效地将失败作为一个分支使用,而不用担心它会破坏您的包

    有关更多信息,请参阅cfrag。这个答案指出了如何为OnError事件处理程序设置传播变量(使事件处理程序成为开放变量)