2010-07-27 115 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