sql-server - 即使任务失败后如何继续执行SSIS SQL作业?

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

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

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

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

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

最佳答案

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

  1. 将 DataFlow 任务(Oledb 连接管理器)的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
      

关于sql-server - 即使任务失败后如何继续执行SSIS SQL作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47246038/

相关文章:

sql-server - 使用带有临时表的存储过程的 BIML 生成 SSIS 包

sql - 使用 SSIS 将表数据的 XML 表示形式提取到文件中

sql - ETL 包最初加载所有数据,然后下次运行以仅加载更改或新项目的最佳方法

sql-server - 在 SQL Server 中获取用户名的 DDL 触发器

c# - 如果找不到数据,SQL Server 查询连续返回 "No data"

SQL Server,如何转置列的数据

c# - SQL Server 代理作业 - SSIS - C# - 尝试删除文件时出现 "Access denied. "

unit-testing - 如何为 Talend 作业编写测试用例?

ssis - 在维度表中生成默认值

mysql - 将数据 GridView 行添加到 vb.net 中的 sql 表