SSIS-接收Excel資料來更新informix資料庫的資料

SSIS-接收Excel資料來更新informix資料庫的資料

之前的專案中客戶說他們的資料有打錯,但已達上百筆查起來大約有7百多筆,要我協助幫他們修改,雖然說是不多,但要一筆筆手根據key更新資料的話,我看會瘋掉,因此我將需要修改的資料先撈到excel中,請他自己更新數值後,我再幫他更新回資料庫中

本來想說要寫個程式來更新,不過後來想說,用ssis不就得了,雖然執行起來有點小久,但總括來講,比寫程式還是快多了

因為就大約花了20分鐘的時間,做了這個範例,並也成功的更新了informix中的資料

怎麼做呢?我想也分享給大家好了,這是一種方式,但不一定是唯一的一種方式,我只是提供我實作的方式出來給大家參考,有任何更好的方式,歡迎留言討論哦..

首先我先拉一個”資料流程工作”

clip_image001

在”資料流程工作”按滑鼠右鍵,點編輯

從資料來源的工具箱中拉出一個”Excel來源”

clip_image002

一開始先新增一個excel連接管理員,選擇一個excel檔,之後在”excel工作表的名稱”中選擇一個sheet

clip_image003

以下是預覽的結果,在此先說明一下,最好先在excel中把資料格式先整理好,整理成像資料表那樣,就第一行為標題,以下都是單純的資料

不要有什麼大標題或按鈕啦,那種奇怪的東西在sheet上,不然會有問題

clip_image004

在資料行的地方,可以選擇你想要處理的欄位即可,當然在excel那裡就處理好的話,那更好,這裡就不用動了

clip_image005

接下來我拉出一個資料轉換的控制項,為什麼要用這個呢?因為我為了避免在執行時會出現什麼轉換錯誤之類,所以我習慣把欄位轉成字串類型輸出

clip_image006

要怎麼知道從excel抓出來的資料型態為何呢?

在”excel來源”按滑鼠右鍵,選擇”顯示進階編輯器”,之後再照下圖操作,就可以看到哪個欄位是什麼類型的囉!

clip_image007

在”資料轉換”按滑鼠右鍵選擇編輯,我把其中兩個欄位原本是數值型別的換成字串型別,並指定其長度

ssis會將轉換後的欄立的輸出別名自動改為該欄位名稱+"的副本”,如果你不喜歡的話,也可以自訂名稱

clip_image008

接下我們必須要新增5個變數,後面會用的到

chkbno,chkno是更新的where條件,資料類型為string

chkyn及setval是要被更新的欄位名稱,資料類型為string

rs是存放excel抓下來的資料暫存,資料類型為object

clip_image009

接下來再拉出一個”資料錄集目的地”,可能有人會說怎麼不用”ole db命令”直接執行就可以了

我也想啊,但我要更新的資料庫對象是informix,礙於driver,只是使用odbc,所以就不能用囉

clip_image010

在”資料錄集目的地”按滑鼠右鍵,選編輯,在元件屬性的頁籤中輸入  rs,這個是我自訂的變數

clip_image011

再切換到”輸入資料行”,我的畫面中,前二個欄位沒有選,因為這二個欄位是轉換前,所以其資料類型是數值,而後二個有”副本”字的資料類型是字串型別

這個畫面的順序要記住,因為後面我們在設定”foreach迴圈容器”時會有關係

clip_image012

接下來切換到控制流程,拉出一個”foreach迴圈容器”

clip_image013\

在”foreach迴圈容器”上按滑鼠右鍵,選編輯

在集合的頁籤中,在 emumerator中選foreach ado 列舉值

然後在下方的ado物件來源變數選擇 rs 這個變數

clip_image014

接下來再切換到”變數對應”

這裡在變數的地方我新增了四個變數,索引的部份一定要按照前述的順序,否則會錯誤,而這個對應錯誤的話,會導致你之後在組sql 後值是不對的

clip_image015

接下來我們拉一個”指令碼工作”到”foreach迴圈容器”中

clip_image016

我們還要在新增一個變數,當作儲存組sql的內容

clip_image017

接下來在”指令碼工作”中按滑鼠右鍵,選編輯,切換到”指令碼”頁籤

在readonlyvariables填入唯讀變數,多個的話,用逗號區隔

在readwritevariables填入可變動內容的變數

之後再點選下方的設計指令碼按鈕,到程式編輯畫面

clip_image018

在main()這裡自行撰寫組sql的語法

讀取變數的方式為

Dts.Variables(“變數名稱”).Value.Tostring

下方的msgbox是我測試sql組起來的結果是對還是錯的測試,正式 run的時候,就會mark掉了,不然每跑一筆就會彈出訊息一次,很煩的

clip_image019

接下來再拉出一個”執行sql工作”

clip_image020

在”執行sql工作”上按滑鼠右鍵,選編輯

在一般頁籤中,設定如下

connectiontype:這裡選的是odbc,因為接的資料庫是informix

connection:要選擇你的共用連線名稱

sqlsourcetype:這裡要選”變數”

sourcevariable:這裡就是要選之前我們設定的變數updatesql

clip_image021

其他的就不用設定囉!因為我們只是要執行update語法,不回傳任何資料,所以在其他頁籤就不用再做設定了

終於大功告成了,接下來就執行看看囉!

下圖執行中的樣子

clip_image022

這次的教學範例雖然比較長,因為動作多及圖多 ,所以會覺得很冗長,其實熟的話,這樣的設定大約也只是幾分鐘就可以設定完了,看複雜度啦

也不是每個case都要那麼麻煩,給需要的人參考看看囉!

這樣做的話效能是有比較差一點,因為是使用了odbc且又是一筆筆更新,一定會較慢,不是批次更新成同一個值,如果批次更新就不用ssis用sql語法就可以了

‧覺得文章不錯請給我一個『讚』作為鼓勵喔!