合并資料3-----------Conditional Split和Slowly Changing Dimension組件
以ProductNumber尋找Excel和資料庫。當資料在Excel中但沒在資料庫的就新增;都在的就更新;資料庫中有資料但Excel中沒資料的就刪除。
不再資料庫中的就刪除。
一、 Conditional Split組件
如果用Product表來實驗,Add時會遇到很大的麻煩:因為完全聯結時,會造成某條紀錄會有多個NULL值,而資料庫中又要求不可為空!這樣就Add不進去!所以我只有從新做一套資料來實驗咯~5555~費了我不少時間啊
1. 準備Excel資料來源,它的資料完全來自於現在的資料庫,一共有9行資料。
但是對其中ID為1,2的ProductNumber資料進行新的修改,用於Add.
ID為3,4的ProductNumber紀錄在資料存在,但是MakeFlag屬性有更改,用於Update.
而資料表,我們把表中ProductNumber值改為一個Excel表中沒有的,為了Delet時計數等於1.現在刪除後有7行資料。
2. 建立MergeDataMerge 包。
3. 拖一個OLE DB 源和Excel源。OLE DB 源串連到Product表,Excel源來串連到指向Product1.xls。
4. 拖入兩個Sort組件,分別按ProductNumber欄位進行升序排序。
5. 添加合并聯結組件。
ProductNumber指OLE DB的欄位。NewProductNumbe指Excel的欄位
這裡我們選的是完全外部串連,這樣才能完全合并兩邊的資料.當一方資料沒有匹配的資料時,用NULL代替.所以我們直接根據合并後的ProductNumber和NewProductNumber 就可以直接判斷出這行資料應該是添加,更新,還是刪除.在Merge Join組件下面,我們添加Conditional Split組件,這個組件來判斷對於不同的情況的分支
6. Conditional Split組件
很簡單,當行中對應的ProductNumber為NULL時,說明沒有從資料庫時面查到匹配的資料,所以這條資料應該進行新增操作,當NewProductNumber為NULL時,說明Excel資料來源中不存在資料庫中ProductNumber對應的資料,所以此條資料應該進行刪除,最後,如果兩個ProductNumber相同,則應該進行更新操作.這裡需要注意的是,一定要把兩個判斷ISNULL的條件放在前面,因為我們在第三個裡面用到了TRIM,如果為NULL值時,會有錯誤發生.
我沒有完成update的任務,也查不出來,後面看吧
解決:
7. 配置OLE DB Destination和OLE DB Command。
OLE DB Command的Update語句
指令碼
UPDATE [dbo].[Product_Teste] SET [MakeFlag] = ?,[Name] = ? WHERE [ProductNumber] = ?
配置列的映射:
這裡一定要注意咯!輸入列的順序與UPDATE語句中參數順序是要一直的!否則,將會報錯。
運行:
沒有衍生的資料行時,的錯誤
運行:
合并後的資料庫
原來的DB
二、 同樣的需求目的用Slowly Changing Dimension組件完成。
1. 準備資料來源,如上。只是DB資料有最後一條有改變。建立包:MergeDataSCDComponent.dtsx
2. 添加Slowly Changing Dimension組件
雙擊這個控制項進行設定,我們會發現,這類似於一個安裝程式,可以一步一步的設定,點擊下一步,首先我們需要選擇資料連線管理器,然後再設定業務鍵,在這裡我們設定ProductNumber列作為業務鍵
再點擊下一步,在這裡我們可以選擇資料來源中的列,然後設定此列的更改類型,分為固定,變化還是曆史,在左面已經列中不同的類型的詳細說明:
可以看到這個組件很強大,可以針對不同的更改類型做出這麼多的區分,我們再點擊下一步,看到在這裡可以設定,如果固定類型的屬性更改時是否轉換失敗,變化的屬性更改時,是否更改所有的匹配記錄.
我們直接下一步,然後完成整個配置,可以看到,Slowly Changing Dimension下面多出來了三個分支和其對應的組件,就象我們前幾次實現的一樣,只不過這次是全部配置完成的.雖然下面的其中的兩個組件名顯示的是英文(估計是沒有對應的中文翻譯),不過還是相應強大的.
我們來看一下這三個自動產生的組件。“插入目標”,它自動產生的是一個OLE DB目標組件,並自動把欄位對應好了,而且對於一些特殊的列已經自動進行了忽略(考慮的還真周到).
其它的兩個更新的操作,都是產生的OLE DB Command組件,而且自動產生了SQL語句。它們完成的目的就是更新資料
指令碼
UPDATE [dbo].[Product_Teste] SET [MakeFlag] = ?,[Name] = ? WHERE [ProductNumber] = ?
運行:
資料庫:
三、 總結
用了兩個組件完成了在一個資料流中新增、更新、刪除(只有Condition Split組件可以)的操作。
用下來感覺第一比較複雜,都是需要手動來配置。但是很靈活你可以根據你的需求對不同操作進行控制。
而第二個都是自動產生,降低了使用的難度,但是就不太靈活了。
項目step1---4原始碼檔案:版本為SQL 2005,運行代碼前還需要安裝ExceL應用程式
/Files/cocole/Step1-4Sql05.rar
作者:悟空的天空(天馬行空)
出處:http://www.cnblogs.com/cocole/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。