【问题标题】:How to continue executing SSIS SQL job even after task fails?即使任务失败,如何继续执行 SSIS SQL 作业?
【发布时间】:2017-11-12 06:11:45
【问题描述】:

场景 该场景是连接到多个 POS 终端并获取数据并保存到暂存 Db 中的表中。例如,有 10 个 POS 终端,每个终端有不同的 IP 和数据库名称。但是执行选择查询的表是相同的。在 SSIS 包中,foreach 循环从源表中选择 IP 和 DB 名称,连接到 POS DB 并保存到暂存表(比如 Destination_table)。由于使用了 foreach 循环,因此连接字符串是使用 SSIS 变量开发的。包被成功执行。

有时,POS db 可能不在线或由于网络问题,连接字符串会在 for 循环中间失败,从而导致 SSIS 包失败。为了克服这个问题,for each 循环属性ForceExecutionResult 设置为“成功”。此后,在执行 SSIS 包时,它会覆盖任何连接问题并简单地继续包中的下一个任务并完成执行。

问题 在 SQL 代理作业中部署包时,它会失败。从错误日志中可以看出,失败的原因是OLEDB连接错误。这意味着,与 SSIS 手动执行不同,SQL 作业不会覆盖 ForceExecutionResult 属性设置。

问题 是否有任何解决方法可以覆盖 SQL 中的此类连接问题并继续执行任务? 我们可以使用事件处理程序来做到这一点吗?或者是否有任何简单的属性设置可以完成这项工作?

【问题讨论】:

    标签: sql-server ssis etl sql-agent-job sql-agent


    【解决方案1】:

    假设您在 ForEach 循环容器内使用 DataFlow 任务,您可以尝试多种解决方法。

    1. 将 DataFlow 任务 Oledb Connection Manager 的 Delay Validation 属性设置为 True
      • 在 DataFlow 任务之前添加一个脚本任务(将其连接到 DFT)
      • 在脚本任务中构建连接字符串并创建一个新的SqlConnection 对象(必须导入System.Data.SqlClient)并尝试在try catch 子句中打开此连接,
      • 如果打开成功则返回成功结果,否则返回失败。
      • 将脚本任务属性FailPackageonFailureFailParentonFailure 设置为False
      • 下面是您可以使用的脚本示例:

        Public Sub Main()
        
            Dim strConnectionstring As String = .....
        
            Using sqlcon As New SqlConnection(strConnectionstring)
        
                Try
        
                    sqlcon.Open()
        
                    Dts.TaskResult = ScriptResults.Success
                Catch ex As Exception
                    Dts.TaskResult = ScriptResults.Failure
                End Try
        
        
            End Using
        
        
        
        End Sub
        

    【讨论】:

    • 感谢哈迪的回复。我会试试这个解决方案。
    【解决方案2】:

    我确实在错误时添加了事件处理程序,以将 POS ip 和其他一些变量插入到表中以调试出错的地方。最终,我发现 SQl 作业实际上正在执行 for 循环而没有中断,但是一旦所有 POS ip 连接都被访问/完成,整个作业状态就会设置为失败(因为某些连接失败 - 猜猜看)。
    作为一个工作回合,我将包本身的 ForceExecutionResult 设置为“成功”。现在,SQL 作业执行成功。

    事件处理程序将数据“failed POS IP”插入errorlogTable,在DFT将“Success POS ip”插入errorlogTable后执行另一个任务。因此,表 errorlogTable 列出了所有 IP,状态为成功/失败。这是我的任务的奖励,作为 EOD,我知道所有 POS 需要手动干预。

    【讨论】:

      【解决方案3】:

      对我来说,我增加了 MaximumErrorCount 属性。 它适用于我。

      【讨论】:

        猜你喜欢
        • 2013-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多