SSIS - 连接断开时

时间:2010-07-27 02:12:39

标签: sql-server visual-studio-2008 ssis

我有一个简单的SSIS包,我在VS2008中编辑。 基本上做的是运行相同的SQL StoredProc,驻留在不同的SQL服务器中,并将它们的输出聚合到一个平面文件中。 简单地说,四个OLE DB数据源转到'Union All'输出。

如果其中一个服务器出现故障,我怎样才能让软件包跳过该源的验证,从而跳过处理,同时仍然汇总可能的内容?

我已快速阅读ConnectionStrings在文件中,使用脚本等等。希望我能避免这种情况。

我事先感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

以下是一些可能的解决方案:

  1. 如果数据库本身不可用但服务器可用,那么您可以将默认连接更改为始终可用的内容,如系统数据库(master,msdb,tempdb,model)。我在查询日志传送的数据库时使用这种技术,因为它们每天每小时都定期处于“恢复”状态。

  2. 如果有另一台服务器始终可用,那么您可以在两者之间创建链接服务器,并使用始终可用的数据库服务器解决错误处理。

  3. 您可以拥有单独的数据流,并且每个数据流都可以将数据附加到文件而不是覆盖内容。然后,您可以设置DelayValidation = True和MaximumErrorCount<>这将允许每个数据流成功,同时避免导致程序包失败错误。

  4. 使用脚本任务执行查询。这将使您能够最大程度地控制如何使用数据源处理异常。对于下面奇怪的示例代码代码感到抱歉,但是代码块没有像通常那样对我进行格式化,所以我尝试使其工作增加了大量的死区。示例代码的要点是向您展示如何查询数据库并捕获错误。您总是可以忽略错误并成功完成。

       // Try-Catch block
        try
    
        {
    
            bool fireAgain = true;
    
            string SQLCommandText = "EXEC dbo.usp_some_stored_procedure_or_select_statement;";
    
        SqlConnection SQLConnection = new SqlConnection("Data Source=SomeServerName;Initial Catalog=master;Integrated Security=SSPI;Application Name=SSIS-My Package Name;Connect Timeout=600");
    
        SqlCommand SQLCommand = new SqlCommand(SQLCommandText, SQLConnection);
    
        SQLCommand.CommandTimeout = 60 * 60;
    
        SqlDataAdapter SQLDataAdapter = new SqlDataAdapter(SQLCommand);
    
        DataTable dt = new DataTable();
    
        SQLDataAdapter.Fill(dt);
    
        SQLConnection.Close();
    
        RowsRemaining = dt.Rows.Count;
    
        Dts.Events.FireInformation(0, "DataTable Rows", RowsRemaining.ToString(), "", 0, ref fireAgain);
    
    }
    
    catch (SqlException e)
    
    {
    
        Dts.Events.FireError(0, "SqlException", e.Message, "", 0);
    
        Error = 1;
    
    }
    
    
    // Return results.
    
    if (Error == 0)
    
    {
    
        Dts.TaskResult = (int)ScriptResults.Success;
    
    }
    
    else
    
    {
    
        Dts.TaskResult = (int)ScriptResults.Failure;
    
    }