對於SSIS和ETL過程而言,我還是很陌生,我想知道是否有任何循環通過DataFlowTask中的記錄集並將每行(從行中派生參數)傳遞到Stored過程(ETL階段的下一個步驟)。一旦我將行傳入存儲過程,我希望每次迭代的結果都寫入表中。 有誰知道如何做到這一點?ETL中的DataflowTask中的循環控制
謝謝。
對於SSIS和ETL過程而言,我還是很陌生,我想知道是否有任何循環通過DataFlowTask中的記錄集並將每行(從行中派生參數)傳遞到Stored過程(ETL階段的下一個步驟)。一旦我將行傳入存儲過程,我希望每次迭代的結果都寫入表中。 有誰知道如何做到這一點?ETL中的DataflowTask中的循環控制
謝謝。
在每個輸入行中執行一次SSIS數據流中的任何OLEDB命令轉換(用於執行數據庫命令) - 我認爲這是您想要的行爲。更多詳情here。
在你的情況下,您將需要至少應:
Data Source -> OLEDB Command -> Data Target
注意,這不會給出色的性能 - 這可能是更好的嘗試和重構你的存儲過程對操作整個輸入一次設置(在這種情況下,您可以在控制流中使用執行SQL任務)。
以下結構將工作:
創建一個對象的變量。 (recordset_object)
創建一個字符串變量。 (record_string)
在控制流中創建一個「執行SQL命令」。該命令應返回要循環訪問的記錄集。
在「執行SQL命令」中,在常規選項卡中設置結果集=完整結果集。
在「執行SQL命令」中,在結果集選項卡中設置結果名稱= 0和變量名稱=(recordset_object)。
創建一個「Foreach循環容器」並在「執行SQL命令」和「Foreach循環容器」之間創建一個優先約束。
在「Foreach Loop容器」中,在Collection選項卡中設置Enumerator = Foreach ADO Enumerator。
在「Foreach循環容器」,在集合選項卡設置ADO對象源變量=用戶:: recordset_object。
在「Foreach循環容器」,在集合選項卡設定的枚舉模式=行中的第一個表。
在「Foreach循環容器」,在設定TEH變量=用戶:: record_string和的設計面中的索引= 0
在「Foreach循環容器」的變量映射標籤控制流,添加一個「執行SQL命令」。 (13)將SQLStatement設置爲使用生成要執行的代碼的變量,或者(14)在參數中映射,或者(15)使用SQL語句該record_string由所述代碼執行的SQL命令。
如果你使用一個變量,那麼它可能類似於User :: sql_code_string,它的值可能類似於「EXEC schema.some_stored_procedure'」+ @ [record_string] +「';」。然後,您可以設置在兒童的常規選項卡中SQLSourceType「執行SQL命令」 =變量和設置的SQLStatement爲User :: sql_code_string。
如果使用參數,在孩子在參數映射 選項卡中設置變量名=用戶:: record_string,方向=輸入,數據類型爲VARCHAR,參數名稱= 0,參數大小「執行SQL命令」 = -1。在孩子的常規選項卡「執行SQL命令」,設置的SQLStatement爲「EXEC schema.some_stored_procedure?」。
類似於13,但不是建立一個單獨的變量,可以執行用戶:: record_string。如果你的數據集所返回的record_string的內容是你想要執行的查詢,這可能會奏效。
我通常比@Ed的解決方案更喜歡這種方法,您可以爲每條記錄添加其他步驟。舉例來說,我經常在添加其他對象在我的控制流像腳本任務,數據流和執行SQL命令。從我的角度來看,這是一個更靈活,易於理解的方法,但是@Ed的解決方案肯定符合您的問題的標準。
祝你好運,讓我知道如果你需要澄清的指示。