上一次我們已經介紹了簡單的資料匯出和匯入,但是只是對單一檔案進行操作,如果我們想同時對一個目錄下面的所有的檔案執行資料匯入怎麼實現呢?相當簡單,SSIS在控制流程中提供了Foreach迴圈容器,很容易理解,它和序列容器相比就是能夠迴圈的遍曆執行,能夠對指定列舉程式的每個成員重複執行控制流程:
可以看到,Foreach迴圈窗器遍曆檔案夾可以通過一些設定或者是正則來匹配,使用 Foreach 迴圈容器,可以枚舉:
• ADO 記錄集行和架構資訊
• 檔案和目錄結構
• 系統、包和使用者變數
• SQL 管理對象 (SMO)
首先我們準備一下資料,把上次產生的Excel檔案重新命名為Product1.xls,建立一個Product2.xls,複製Product1.xls中的ProductID<800的行到建立的Product2.xls中(注意兩個Excel的Sheet名字一致),然後在我們的SSIS項目中建立一個ForeachInput包,Foreach 迴圈容器容器進來,雙擊進行集合設定,在檔案夾處指定我們Excel檔案所在的檔案路徑,比如F:\ ,檔案名稱處寫*.xls,這樣就能夠匹配出所有的尾碼名為xls的檔案,然後單獨執行容器裡面的流程,不過在我們的容器中需要去訪問每一個Excel檔案,我們必須獲得每一個枚舉變數也就是檔案的名稱,可以通過設定變數映射實現.
如,建立變數後,每次找到一個與條件相匹配的檔案時,Foreach 迴圈容器就會將用該檔案名稱填充使用者定義的變數.同理,當我們遍曆其它對象時,也可以採用變數的方式進行映射,獲得遍曆到的單個匹配對象.
然後我們直接把上一次建的包(OutputAndInput.dtsx)中的資料匯入這個資料流組件複製到Foreach 迴圈容器中(就象複製普通檔案一樣,呵呵),同樣也把連線管理員中的Excel檔案串連和資料庫連接複製過來.這樣我們基本上已經完成了,只不過現在的Excel檔案串連還是指定檔案,我們只需要和我們的變數currentFilePath綁定上就行了.點擊我們的Excel檔案串連,在右邊的屬性中點擊Expressions.
在屬性運算式編輯器裡,我們可以對Excel檔案串連的所有的屬性的值直接用運算式綁定,不僅是Excel檔案串連,象普通檔案串連,資料庫連接,FTP串連同樣可以.這無疑提高了靈活性.在這裡,我們僅需要綁定其檔案路徑,在屬性裡選擇ExcelFilePath,然後點擊運算式後面的省略符號按鈕.
這裡不僅可以直接繫結系統變數和使用者變數,而且可以使用指令碼組合成運算式.我們只需要選定使用者變數currentFilePath.點擊計算運算式,只是一個空的字串,因為此時並沒有進行遍曆.所以點擊後發現Excel Source資料流源組件顯示紅色的,提示檔案並不存在,我們不需要此時對檔案進行檢測,所以將Excel檔案串連的延遲驗證DelayValidation屬性值設定成True.
我們為了防止和資料庫裡面已經有的資料發生衝突,修改衍生的資料行組件,因為上一次我們是ProductNumber和Name加了1,這次我們加2.
然後右擊包執行,你會發現執行成功,而且是執行了兩次資料流(有可能很快看不出來),可以通過對比資料庫看出來,已經添加進了兩個Excel表裡的資料.當然,你可以分成更多個Excel,多少個都沒有關係.
此處,你也可以通過添加資料檢視器進行查看執行過程中的資料,這樣可以很方便的進行SSIS包的簡單的調試.右擊衍生的資料行組件和Product目標表中間的綠色,點擊資料檢視器,然後點擊添加,再選擇網路,其它全部預設,確定.
我們把衍生的資料行中改成+"3”時再次運行包,你會發現所有的組件都是黃包,這代表正在執行,在彈出來的資料檢視器中可以看到所有的資料流的55行資料,點擊上面的綠色按鈕可以繼續運行.通過資料檢視器我們可以查看正在資料流中傳輸的資料.
我們在上面的資料檢視器中就可以看到新增加的NewProductNumber和NewName兩個列是否正確.
到現在我們就已經完成了大量匯入Excel,本次我們主要學習了Foreach迴圈容器,並且配合使用者變數的使用,以及在使用連接器中的串連的一些簡單設定,比如屬性動態綁定運算式等,另外還介紹了資料檢視器的用法.
參考文章:http://blog.csdn.net/jinjazz/archive/2008/07/25/2710169.aspx
http://www.oracle.com.cn/redirect.php?tid=85304&goto=lastpost
本次專案檔下載.(for Vs 2005)
作者:孤獨俠客(似水流年)
出處:http://lonely7345.cnblogs.com
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。