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