首页 文章

如果任务失败,如何继续执行SSIS SQL作业?

提问于
浏览
2

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

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

Problem 在SQL Agent作业中部署包时,它失败 . 从错误日志中,确定失败的原因是 OLEDB connection error . 这意味着,与SSIS手动执行不同,SQL作业不会覆盖 ForceExecutionResult 属性设置 .

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

2 回答

  • 1

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

    • 将DataFlow任务(Oledb连接管理器)的 Delay Validation 属性设置为 True

    • 在DataFlow任务之前添加脚本任务(将其连接到DFT)

    • 在脚本任务内部构建连接字符串并创建一个新的 SqlConnection 对象(必须Imports System.Data.SqlClient )并尝试在try catch子句中打开此连接,

    • 如果成功打开,则返回Success结果,否则返回失败 .

    • 将脚本任务属性 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
    
  • 1

    我确实在错误时添加了eventhandler,将POS ip和少数其他变量插入表中以调试出错的地方 . 最后,我发现SQl作业实际上是在执行循环而不会中断,但是一旦访问/完成所有POS ip连接,整个作业状态就会设置为失败(因为某些连接失败了 - 猜测是这样) .
    作为一个工作回合,我将包本身的ForceExecutionResult设置为“Success” . 现在,SQL作业执行成功 .

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

相关问题