如果重命名等文件系统任务失败,例如文件不存在,则 SSIS 会将其视为错误。这意味着整个包都失败了。我可以通过使用脚本任务或将包的最大错误设置为多个来解决这个问题。将包的最大错误数设置为大于 1 的问题在于,如果错误发生在包的其他地方,则包不会在应该失败的时候失败。
那么有没有办法以某种方式吞下错误并仍然能够根据文件系统任务的成功或失败进行分支?我尝试将文件任务粘贴到序列容器中,并将 ForceExecutionResult 设置为成功,但程序包仍然失败,表示已达到最大错误数。
最佳答案
这是一种可能的选择。您可以通过将 File System Task 之后的 Precedence Constraint
更改为 Completion
来实现问题中提到的要求。以下示例显示了如何完成此操作。该示例是使用 SSIS 2008 R2
创建的,但也适用于以前的版本。
分步过程:
创建一个 SSIS 包并创建两个变量,如屏幕截图 #1 所示。将一些不存在的文件路径值分配给变量。
在包的控制流选项卡上,放置文件系统任务、脚本任务和数据流任务,如屏幕截图#2 所示。脚本任务和数据流任务在这里是虚拟的,任务未配置为执行任何操作。
如截图 #3 所示配置文件系统任务。
屏幕截图 #4 显示了程序包的执行情况,正如预期的那样,文件系统任务失败,因为文件路径不存在。此外,由于错误,程序包在文件系统任务之后停止执行任务。
右键单击
File System Task
和Script Task
之间的 Precedence constraint 箭头,然后选择 Completion,如屏幕截图所示 # 5。箭头应从绿色变为蓝色。屏幕截图 #6 显示了优先约束更改后的程序包执行。文件系统任务仍然失败,但其他任务继续执行。
之前
,条件是仅当文件系统任务成功 时才执行脚本任务。现在
,条件是在File System Task执行完成后(无论成功或失败)执行Script Task。如果您想让包根据成功/失败完全采用两条不同的路径。您可以按照屏幕截图 #7 和 #8 中所示进行操作。红色箭头表示路径将在文件系统任务失败时采用,绿色箭头表示路径将在文件系统任务成功执行时采用。在执行屏幕截图 #7 中显示的包之前,我在路径
C:\temp\Source.txt
中创建了一个文件。包执行后,文件被重命名并且路径不再存在。因此,包失败,如屏幕截图 #8 所示。
希望对您有所帮助。
屏幕截图 #1:
屏幕截图 #2:
屏幕截图 #3:
屏幕截图 #4:
屏幕截图 #5:
屏幕截图 #6:
屏幕截图 #7:
屏幕截图 #8:
关于ssis - 在 SSIS 中的文件系统任务之后分支而不会使包失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/493238/