2010-07-27 181 views
2

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

如果其中一台服务器出现故障,我怎样才能让软件包跳过对该源进行验证并因此进行处理,同时仍然聚合可能的内容?

我已经快速阅读了ConnectionStrings正在一个文件中,使用脚本等,希望我可以避免这种情况。

我提前感谢您的任何帮助。

回答

2

这里有几个可能的解决方案:

  1. 如果数据库本身是不可用的,但服务器可用,那么你可以更改默认的连接的东西,总是可以像一个系统数据库(主, msdb,tempdb,模型)。在查询日志发布的数据库时,我使用这种技术,因为它们每天每个小时定期处于“恢复”状态。

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

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

  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; 
    
    } 
    
+0

谢谢您的回答,非常感谢。 我正在给脚本任务去。 我可能会根据服务器是否可用而返回true/false,然后根据可用性有条件地获取并追加数据的数据流? 嗯..想法.. :) – 2010-08-02 01:06:08

+0

我面临的另一个问题是数据整理的文件具有日期时间戳的文件名。这是通过一个包级变量创建的。如果我使用不同的数据流,他们将不得不通过不同的文件连接通过变量引用它? – 2010-08-02 01:17:10

+0

关于基于服务器可用性返回true/false,上面的代码已经为您提供了一个控制返回true/false的变量。如果您想检查特定文本的错误消息以确定要执行的操作,则可以调整异常块以实现此目标。 – 2010-08-10 01:12:35