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

时间:2017-11-12 06:11:46

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

  1. 将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 :(得分:1)

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

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

答案 2 :(得分:0)

对我来说,我增加了MaximumErrorCount属性。 它对我有效。enter image description here