【问题标题】:execute failure precedence constraint without showing task failure执行失败优先约束而不显示任务失败
【发布时间】:2018-02-03 21:25:33
【问题描述】:

我在一个 SSIS 包中有 3 个任务。第一个任务是 Execute Process Task,它运行 PowerShell 命令从网站下载文件。如果命令失败,则任务失败。所以我有两个从它到另外两个任务的连接:一个是成功的,一个是失败的。

该软件包按预期工作。如果Execute Process Task 成功,它将运行相关的成功任务。如果失败,它会运行相关的失败任务。

问题在于,如果 Execute Process Task 失败,即使它正确/正确地运行了与其连接的失败任务,它也会显示任务失败。

有没有办法让它停止显示为失败,但即使Execute Process Task 失败仍然运行相关的失败任务?

【问题讨论】:

  • 是的,有一种方法 - 你用谷歌搜索它! datachix.com/2011/02/08/…
  • @Nick.McDermaid 我认为 OP 要求 从执行流程任务中删除失败标记,同时运行与这个任务。这是与Foreach Loop container 不同的情况。我认为如果没有解决方法就无法做到这一点
  • 在下面的 OP 评论中,他添加了“整个包注册为失败” - 这当然在原始帖子中没有提到并且提出了不同的问题。链接中的想法应该能够用于任何任务......虽然我不确定。我确实记得以不同的方式执行此操作(未将包标记为失败),尽管我不记得了
  • @Nick.McDermaid 我认为你是对的,我更新了我的答案,看看吧

标签: sql-server ssis constraints etl operator-precedence


【解决方案1】:

更新 1

如果您需要包不会导致失败,那么您应该在任务上将FailPackageOnFailureFailParentOnFailure 设置为False,您还应该在包本身上将MaximumErrorCount 设置为大于1 .如果Execute Process Task 失败,它将增加包的错误计数,如果错误计数超过MaximumErrorCount,则包可以/仍然会失败。否则,如果您只需要任务不显示失败,则无法完成

SSIS -- Allow a task to fail but have the package succeed? (查看所有答案,不仅是接受的答案)


初步回答

如果优先任务总是成功,则不能使用失败优先约束

我认为你做不到。因为failure 优先约束(连接器)仅在优先任务失败时才有效。您可以使用ForceExecutionResult 属性让任务始终成功,但永远不会使用失败连接器。

解决方法

我不确定这是否有帮助,但不是使用失败优先约束,而是使用 ExecValueVariable 属性将执行值存储在变量中,并将表达式添加到优先约束 *(两个连接器都将具有 @987654332 @约束和类似的表达式:

@[User::ResultValue] = 1

@[User::ResultValue] = 0

旁注:ExecValueVariableForceExecutionResult等属性在属性选项卡中,点击任务并按F4显示

【讨论】:

  • 任务确实失败了。如果 Execute Process Task 调用的 PowerShell 命令失败,则流程会通过 failure 优先连接器。这一切都有效。问题是Execute Process Task 也显示为失败,因此包作为一个整体注册为失败。我认为如果使用失败优先约束来处理任务失败,那么该任务仍然会成功。
  • @IMTheNachoMan 如果您需要包不会导致失败,那么您应该在任务上设置FailPackageOnFailure,您还应该在包本身上设置MaximumErrorCount 大于1。该任务仍将增加包错误计数,如果错误计数超过MaximumErrorCount,则包可能/仍将失败。否则,如果您只需要任务不显示失败,则无法完成
  • FailPackageOnFailureFailParentOnFailure 都设置为 False 但没有效果。并且更改MaximumErrorCount 将无济于事,因为无论运行多少次任务都会失败。我认为如果一个任务有一个失败的连接,那么这就像说“优雅地失败”,所以这个任务不会显示为失败。如果你问我糟糕的设计。不过谢谢!
  • @IMTheNachoMan 您所追求的无法完成,我的答案更新是仅当从 SQL 代理作业或应用程序执行包并且您希望包执行返回成功而不是失败时
  • @IMTheNachoMan 你唯一能做的就是解决方法
【解决方案2】:

因此,即使父任务失败并且与失败输出对应的任务成功,您似乎也希望将任务显示为成功。 为此,您需要将 FailTask​​ReturnCodeIsNotSuccessValue 字段编辑为 False,这样即使父任务未返回 successValue,该任务也不会显示为失败。希望这会有所帮助!!。

【讨论】:

  • 我希望任务失败并路由到失败连接(确实如此),但我不希望任务显示为失败,因为这会使整个包失败。
  • @IMTheNachoMan set MaximumErrorCount > 执行进程任务抛出的错误数
  • @Yahfoufi Execute Process Task 每次调用都会成功或失败。它所做的只是尝试使用 PowerShell 下载文件。如果文件不存在,那么它将失败。
猜你喜欢
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
相关资源
最近更新 更多