讓我們首先開始學習SSIS吧,利用SSIS把SQL Server中的資料匯出.首先,開啟Vs.net 2005,選擇商業智慧項目,然後選擇模板中的Integration Service項目,輸入項目名稱:
建立好後,我們就在預設的Package包中進行設計(關於一些概念性的就不介紹了,請參照這個文章, 或者是其它的教程或者書籍).首先向控制流程中添加一個資料流組件(Data Flow Task),雙擊進入資料流.從左邊的工具箱中選擇OLEDB資料來源(OLE DB Source),可以看到,添加進去後是紅色的.雙擊設定一下串連,如果沒有已經建立的連結,則建立一個串連,選定後設定直接存取Produt表,當然在這裡也可以通過sql語句擷取資料來源,其中可以調用預存程序,另外還可以通過變數設定的方式,可以把表或者視圖的名稱,或者sql命令直接放在變數中.
OK,確認了之後,發現紅色的錯誤提示已經不存在了.接下來,我們直接再添加一個目標資料來源,我們將資料匯出成Excel資料格式,所以選擇Excel Destination,同樣,雙擊對Excel連線管理員進行配置,配置好檔案名稱和路徑以後(此處選擇在首行顯示列名,這樣會從第二行開始才開始顯示資料),如果檔案不存在,直接選擇下面的建立,建立新的Excel工作表.
然後從左邊切換到映射,對資料流中的中繼資料的列和Excel表中的列進行一一映射,因為剛才是自動建立的Excel工作表,所以預設是根據名稱對應的.這樣我們就完成了對Product產品表的匯出,在右邊的解決方案中,右擊執行包,可以看到綠色執行成功.
開啟剛才指定的路徑中的Excel檔案,已經包含了匯出的資料.是不是比手工寫C#代碼實現資料庫資料匯出到Excel檔案方便了很多?呵呵,這還只是最基礎的功能.我們通過設定sql語句匯出所有顏色為黑色的產品,讓我們把OLEDB資料來源的訪問模式改成sql命令,然後輸入查詢語句:
SELECT * FROM Production.ProductWHERE (Color = 'Black')
再次執行時就會發現產生的Excel表中已經只包含了Color=’Black’的資料(注意,如果你剛才所有的資料的Excel檔案沒有刪除,你會發現這
次匯出的資料是添加到了上次的資料的後面).
接下來,我們再將剛才匯出的產品資料匯入Product表中.再添加Excel Source和OLE DB Destination,其實就是做和匯出相反的過程.把
Excel Source的OLEDB串連指向Excel連線管理員(剛才匯出中Excel Destination中設定的,在下面連線管理員中會列出來),
OLE DB Destination的串連設定成OLE DB Source中的資料庫連接,同樣,設定成以[表或視圖]的方式訪問Product表,確定後發現有紅色錯誤
提示,這是因為資料庫中Product產品是以ProductID作為主鍵標識的,所以不能夠插入,我們從映射中設定將ProdutID欄位刪除,
同樣的,我們需要將rowguid欄位,這兩個欄位都是資料庫中自動產生的.
再次確認後會發現已經沒有錯誤,只剩下了黃色的警告,我們現在暫時不理會這個警告.我們把剛才產生的Excel檔案刪除,重新設定Excel連線管理員產生新的空Excel檔案(或者把產生的Excel中的資料刪除),然後再次運行包,你會發現,剛才的資料匯出仍然正常,但是資料匯入卻顯示的是沒有匯入任何資料,這是因為在資料中剛才的資料匯出和匯出並沒有先後,所以他們是同步執行的,執行匯入時發現裡面的資料為空白,所以沒有匯入成功任何資料.不過,嘗試著把資料匯入的操作直接放在Excel Destination後面是失敗的,Excel Destination就是資料流目的地,意味著整個流程的結束.(此時Excel Destination中只可定義一個錯誤輸出).
我們切換到控制流程,再添加一個資料流程工作,將第一個資料流任何指向這個(滑鼠拖拉綠色箭頭):
雙擊剛添加的資料匯入(已經編輯的資料流組件名稱),把剛才的資料流中的組件剪下過來.清空Excel資料再次運行包,怎麼還是有錯誤,”這是為什麼呢?” ,呵呵,看下面的錯誤資訊:
An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80040E2F Description: "語句已終止。".
An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80040E2F Description: "不能在具有唯一索引 'AK_Product_ProductNumber' 的對象 'Production.Product' 中插入重複鍵的行。".
其實產品編號ProductNumber也是主鍵,呵呵,這個問題是在運行前SSIS沒有提示的.怎麼辦呢?為了達到目的,我們暫時通過添加一次轉換,在剛才的資料流源和資料流目的地中間再添加一個衍生的資料行組件(Derived Column ,Updates column values using expressions).添加一個新列NewProductNumber,在Excel中的產品編號後面加1,組成新的產品編號,同樣我們派生出一個新的產品名稱Name,因為在資料庫中同樣也有唯一性限制式.
同時,我們還要修改OLE DB目標中的映射,將目標列的ProductNumber對應的輸入列ProductNumber改成剛才派生的NewProductNumber.將目標列的Name對應的輸入列Name改成剛才派生的NewName.清空Excel資料,再次運行包,都變成了綠色,執行全部成功
通過對比資料庫,確實已經成功的添加進了93行新的資料.
細心的可能會發現,控制流程中的資料匯出和匯入兩個組件其實是前後約束條件的,也就是必須資料匯出必須成功了才會執行匯入(後面會介紹).另外,所謂的資料匯出並不會局限於資料庫的匯入和匯出,資料流源和資料流目的地都可以是Excel,Flat File(txt,csv),XML,DataReader等串連.也就是說同樣可以實現txt匯入Excel,或者是XML匯入資料庫等操作.
好了,今天是SSIS的一個入門,我們利用SSIS實現了資料的匯入和匯出,把Product表中的資料匯出成Excel,然後對產品編號和名稱兩個欄位經過派生的功能進行轉換再匯入到資料庫中,這其中我們認識了控制流程和資料流,資料流源和資料流目的地,並且還引入了衍生的資料行組件來實現我們的匯入(這裡主要是為了實現匯入,有可能是正好產品名稱相對1這個字元導致錯誤).
本次專案檔下載.(for Vs 2005)
作者:孤獨俠客(似水流年)
出處:http://lonely7345.cnblogs.com
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。