场景 该场景是连接到多个 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 任务,您可以尝试多种解决方法。
- 将 DataFlow 任务(Oledb 连接管理器)的
Delay Validation
属性设置为True
- 在 DataFlow 任务之前添加脚本任务(将其连接到 DFT)
- 在脚本任务内构建连接字符串并创建一个新的
SqlConnection
对象(必须导入System.Data.SqlClient
),并尝试在 try catch 中打开此连接子句, - 如果打开成功则返回成功结果,否则返回失败。
- 将脚本任务属性
FailPackageonFailure
和FailParentonFailure
设置为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/