2013-06-05 35 views
3

我正在嘗試編寫從許多相同服務器收集數據到中央存儲庫的ETL。我想要做的是編寫一個包含源地址,用戶ID和密碼的包作爲參數,並對每個要複製的服務器執行一次包。使用連接屬性的SSIS 2012包參數

這是可行的嗎?我如何使用參數來創建源代碼?

+0

將數據跨所有這些服務器相同結構的其餘部分

  • 重複步驟4-7?您的軟件包將在哪個版本的SQL Server中創建(2005,2008,2008r2,2012)? – billinkc

  • +0

    所有服務器的模式都是一樣的。 SSIS是2012. – Metaphor

    回答

    9

    我想問如何參數化連接管理器(甚至是一個真正的單詞?),而不是存儲連接參數的位置。答案很簡單:

    1. 爲服務器,數據庫,用戶ID和密碼
    2. 創建包參數創建一個連接管理器爲定義一旦連接定義數據流組件
    3. ,右鍵單擊的一部分在包裝設計屏幕底部的連接管理器上,然後選擇「參數化」。在屬性下拉
    4. 選擇「使用現有參數」或
    5. 選擇「服務器名稱」創建新的參數,如果跳過了步驟1
    6. 如果使用現有的參數,從下拉
    7. 單擊OK選擇它保存(必須這樣做每個參數之後)的參數
    1

    您可以將參數存儲在表中。使用sql任務查詢表並將結果存儲在對象變量中。然後你可以在for循環中使用這個變量。在每次循環迭代期間,使用SSIS中的表達式來更改連接的值。

    Severalbooks概述了這種方法。這是一個代碼example


    這裏有一些步驟 - 希望我沒有錯過任何東西。你提到一個服務器「地址」,但我不確定你正在嘗試做什麼。這個例子查詢多個sql服務器。

    您可以使用字符串類型創建具有對象類型的變量SQL_RS,SRV_Conn。這持有我的服務器名稱。在執行SQL任務中,我有一個查詢,它返回我想查詢的sql服務器的名稱。然後設置以下屬性:

    SELECT  RTRIM(Server) AS servername 
    FROM   ServerList_SSIS 
    WHERE  (Server IS NOT NULL) 
    and coalesce(exclude,'0') <> 'True' 
    and IsOracle is Null 
    

    執行SQL任務>常規>的ResultSet = 「整個結果集,」

    執行SQL任務>結果設置選項卡 「結果集名稱= 0」,變量名=「用戶:: SQL_RS「

    因此,我們現在有一個SQL_RS變量中的服務器名稱列表。

    的ForEach>收藏>枚舉= 「FOREACH ADO枚舉」

    的ForEach>收藏>枚舉配置> ADO對象源變量=用戶:: SQL_RS

    此映射SQL_RS的第一列反對SRV_Conn變量,因此循環的每次迭代都會在此變量中產生一個新值。

    的ForEach>變量映射>變量=用戶:: SRV_Conn,指數= 0

    給ForEach裏面有一些其他的SQL執行官,執行查詢的SQL數據庫,所以我需要改變我的「多服務」的服務器名稱連接。我有最初查詢的另一個連接,它讓我得到要查詢的服務器列表。使連接動態在連接屬性中完成 - 右鍵單擊​​連接>屬性。單擊表達式右側的省略號。

    連接>屬性>表達式>物業=服務器,表達式= 「@ [用戶:: SRV_Conn]」

    注:0爲變量的映射的索引值適用於本機OLEDB \ SQL服務器本機客戶端。如果您使用的是其他數據庫提供程序,則可能需要使用其他索引類型 - 這會使設置更加混亂。

    OLEDB = 0,1 
    ADO.NET = @Varname 
    ADO = @Param1, Param2 
    ODBC = 1,2 
    

    全面上市here

    +0

    這實際上是我的問題 - 你如何在SSIS中更改連接的值?我的理解是,它不像創建連接,命令和讀者那麼簡單。 – Metaphor