无法访问一个连接字符串时继续SSIS包

无法访问一个连接字符串时继续SSIS包,ssis,Ssis,我有一个奇怪的情况。我有一个SSIS包,这个包从SQLServer中的表中获取连接字符串 数据源=XYZ;初始目录=邮件;Provider=SQLNCLI11.1;综合安全=SSPI;自动翻译=假;还有更多像这样的连接字符串。 它使用此连接字符串将记录插入到所需的SQL server。但是,每当无法访问服务器时,SSIS包就会失败并停止执行 我想知道,如果某台服务器出现故障,我们如何继续SSIS包,这样就不会影响其他服务器。非常感谢您提供的任何帮助或意见。我认为当前的软件包看起来像 执行SQL任

我有一个奇怪的情况。我有一个SSIS包,这个包从SQLServer中的表中获取连接字符串 数据源=XYZ;初始目录=邮件;Provider=SQLNCLI11.1;综合安全=SSPI;自动翻译=假;还有更多像这样的连接字符串。 它使用此连接字符串将记录插入到所需的SQL server。但是,每当无法访问服务器时,SSIS包就会失败并停止执行


我想知道,如果某台服务器出现故障,我们如何继续SSIS包,这样就不会影响其他服务器。非常感谢您提供的任何帮助或意见。

我认为当前的软件包看起来像

执行SQL任务获取连接字符串的主列表

ForEach记录集枚举器将当前连接字符串分配给变量

执行SQL任务插入到表中

对于找到的每个记录,将其分配给一个变量,然后该变量用于驱动OLE DB连接管理器的ConnectionString属性

假设这近似于问题,则需要在第3步中添加前体步骤,以测试连接字符串/管理器的有效性。在SSI中,这通常通过脚本任务实现。与其处理脚本任务失败的问题,不如创建一个名为IsConnectionValid的SSIS变量,脚本任务的结果是根据连接状态将其设置为True或False

伪逻辑 假设只读集合是我们的变量@[User::ConnectionString]

假设读/写集合是我们的变量@[User::IsConnectionValid]

假设我可以在不打开文本编辑器的情况下编写代码,但逻辑是合理的

// re-initialize our state to false
Dts.Variables["User::IsConnectionValid"].Value = false;
// Access the current connection string
string cs = Dts.Variables["User::ConnectionString"].Value.ToString();
try
{
    using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(cs))
    {
        conn.Open();
        // If the connection didn't blow chow, then it's good *right now*
        // The server could fall over in the next instant but this is the best we can do
        Dts.Variables["User::IsConnectionValid"].Value = true;
    }
}
catch(Exception ex)
{
    // Swallow the error
    ;
}
现在,我们已经运行了这个脚本任务并安全地评估了我们的连接,最后一步是更改这个新的步骤3脚本任务和旧的步骤3执行SQL任务之间的优先级约束。双击连接线,并将其从当前默认值OnSuccess更改为PreventAndConstraint name


该约束只是@[User::IsConnectionValid],它仍然是一个有条件的约束。这意味着,只有当变量为true且前一个任务没有失败时,它才会向Execute SQL任务发出激发信号。

我假设当前包看起来像

执行SQL任务获取连接字符串的主列表

ForEach记录集枚举器将当前连接字符串分配给变量

执行SQL任务插入到表中

对于找到的每个记录,将其分配给一个变量,然后该变量用于驱动OLE DB连接管理器的ConnectionString属性

假设这近似于问题,则需要在第3步中添加前体步骤,以测试连接字符串/管理器的有效性。在SSI中,这通常通过脚本任务实现。与其处理脚本任务失败的问题,不如创建一个名为IsConnectionValid的SSIS变量,脚本任务的结果是根据连接状态将其设置为True或False

伪逻辑 假设只读集合是我们的变量@[User::ConnectionString]

假设读/写集合是我们的变量@[User::IsConnectionValid]

假设我可以在不打开文本编辑器的情况下编写代码,但逻辑是合理的

// re-initialize our state to false
Dts.Variables["User::IsConnectionValid"].Value = false;
// Access the current connection string
string cs = Dts.Variables["User::ConnectionString"].Value.ToString();
try
{
    using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(cs))
    {
        conn.Open();
        // If the connection didn't blow chow, then it's good *right now*
        // The server could fall over in the next instant but this is the best we can do
        Dts.Variables["User::IsConnectionValid"].Value = true;
    }
}
catch(Exception ex)
{
    // Swallow the error
    ;
}
现在,我们已经运行了这个脚本任务并安全地评估了我们的连接,最后一步是更改这个新的步骤3脚本任务和旧的步骤3执行SQL任务之间的优先级约束。双击连接线,并将其从当前默认值OnSuccess更改为PreventAndConstraint name


该约束只是@[User::IsConnectionValid],它仍然是一个有条件的约束。这意味着,只有当变量为true且前一个任务没有失败时,它才会向Execute SQL任务发出激发信号。

这非常有效。我有同样的想法,但不知道如何实施。你解释得很好。真的很感激。这很有魅力。我有同样的想法,但不知道如何实施。你解释得很好。非常感谢。