SQL Server BI Step by Step --- 使用SSIS進行簡單的資料匯入匯出
讓我們首先開始學習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.Product WHERE (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這個字元導致錯誤).