2014-09-25 77 views
0

我有關於ssis包的問題。我想在運行我的ssis包時動態地填充一個變量。該變量應該是正在執行的當前步驟/任務的連接字符串。例如,如果我有一個包含兩個步驟的ssis包,則第一步的連接是Server1DB1,第二步的連接是Server2DB2。當我在運行程序包時,第一步忙於執行變量應該是Server1DB1,一旦完成並且第二步正在執行,變量應該是Server2DB2。我試圖找到答案,但所有文章都講述瞭如何根據變量改變連接,而不是反之。任何幫助都感激不盡。提前感謝你。如何從connectionstring ssis設置變量

+0

動態部分在哪裏起作用?任務A在Server1DB1上執行某些操作,任務B在Server2DB2上執行某些操作 – billinkc 2014-09-25 13:41:38

+0

嗯,也許我使用了錯誤的單詞......但是在運行時,當每個步驟都在執行時,變量會被更新/更改爲正在執行的當前步驟/任務的連接。 – 2014-09-25 13:44:29

+1

我還沒有「明白」。任務A在Server1B1上執行X.該執行的結果是否以任何方式確定執行任務B的位置? – billinkc 2014-09-25 13:46:18

回答

0

在腳本任務中,從Dts.Connections獲取ConnectionManager的適當連接,然後將其ConnectionString屬性分配給ReadWrite變量。

如果ConnectionString由表達式設置,則需要讓連接管理器獲取連接,以便使用表達式的當前值更新ConnectionString屬性。

例如:

public void Main() 
    { 
     // Where "MyOLEDBConn" is the connection's name 
     var connectionManager = Dts.Connections["MyOLEDBConn"]; 

     // AcquireConnection/ReleaseConnection is unnecessary if ConnectionString isn't set by an expression 
     var rawConnection = connectionManager.AcquireConnection(Dts.Transaction); 

     // "User::ConnectionString" is configured as a ReadWrite variable for the Script Task 
     Dts.Variables["User::ConnectionString"].Value = connectionManager.ConnectionString; 

     connectionManager.ReleaseConnection(rawConnection); 

     Dts.TaskResult = (int)ScriptResults.Success; 
    } 

任務獲取連接字符串的當前值的基礎上,其表達,因此它需要在表達式的值是相同的,因爲它要在一個點執行當被記錄的任務獲得了連接時。這個任務可能直接放在你想要記錄的每一步之前或之後,或者(更好的是)在事件處理程序之前或之後執行。

一種替代

另一種方法將是使用表達式任務配置連接字符串,並將其分配給一個變量。連接(通過表達式)和您的日誌記錄過程都可以使用此變量,從而無需從ConnectionManager中獲取連接字符串。這將消除對上述腳本任務的需要。

+0

嗨,謝謝你的回答。只是一個問題什麼是MyOLEDBConn?我在那裏使用哪個連接名稱? – 2014-09-29 09:23:23

+0

@LiamDomingo,將「MyOLEDBConn」替換爲您的連接名稱。您可以在創建連接時選擇該名稱。 – 2014-09-30 12:58:32

+0

連接是一個普通的SSIS連接,就像創建任何其他SSIS連接一樣。 – 2014-09-30 14:03:42