方案 方案是连接到多个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中覆盖此类连接问题并继续执行任务? 我们可以使用事件处理程序吗?或者是否有任何简单的属性设置可以完成这项工作?
答案 0 :(得分:1)
假设您在ForEach循环容器中使用DataFlow任务,您可以尝试许多解决方法。
Delay Validation
属性设置为True
SqlConnection
对象(必须Imports 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
答案 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)