創建SSIS包—建立端到端的package
通過基本task和transforms的學習,現在可以轉入到SSIS實際應用。建立端到端的package這個系列中首先講解將一系列的文件數據導入到SQL Server中的方法,然后添加一些復雜轉換,最后將看到如何在package中處理錯誤和動態地創建package。
創建一個項目
使用SSIS的首要目的是從數據源中讀取數據,然后寫入Destination中,這個向導介紹從平面文件中讀取數據。使用下面的文字
Zipcode State ZipName
32008 FL BRANFORD
32009 FL BRYCEVILLE
32011 FL CALLAHAN
32013 FL DAY
32033 FL ELKTON
32034 FL AMELIA ISLAND
32038 FL FORT WHITE
32040 FL GLEN SAINT MARY
32043 FL GREEN COVE SPRIN
32044 FL HAMPTON
32046 FL HILLIARD
32052 FL JASPER
32053 FL JENNINGS
32054 FL LAKE BUTLER
32055 FL LAKE CITY
32058 FL LAWTEY
32059 FL LEE
32060 FL BOYS RANCH
32061 FL LULU
32062 FL MC ALPIN
32063 FL MACCLENNY
32065 FL ORANGE PARK
32066 FL MAYO
32068 FL MIDDLEBURG
32071 FL O BRIEN
32073 FL ORANGE PARK
32082 FL PONTE VEDRA BEAC
32083 FL RAIFORD
32084 FL SAINT AUGUSTINE
32086 FL SAINT AUGUSTINE
32087 FL SANDERSON
32091 FL STARKE
32092 FL SAINT AUGUSTINE
32094 FL WELLBORN
32095 FL SAINT AUGUSTINE
32096 FL WHITE SPRINGS
32097 FL YULEE
32102 FL ASTOR
32110 FL BUNNELL
32112 FL CRESCENT CITY
32113 FL CITRA
創建ZipCode.txt文件,這個文件包含美國郵政編碼。新建一個項目,選擇項目類型Integration Service Project,如圖5-1,將默認的package文件Package.dtsx重命名為ZipLoad.dtsx。

圖5-1
創建連接
我們創建一個能在多個package中使用的連接,在解決方案管理器中右擊Data Source文件夾新建一個數據源,打開數據源向導,選擇“Create a data source based on an existing or new connection”點擊New,代開連接管理器。
注意:有多種方式建立數據源連接,例如,可以在Data Flow中拖放數據源任務。
選擇Native OLE DB\SQL Native Client,輸入連接名字,為方便讀寫數據庫選擇授權模式,最后選擇AdventureWorks數據庫,點擊OK。如果沒有安裝AdventureWorks數據庫可以任意選擇一個數據庫,然后測試連接,將數據源命名為AdventureWorks。在DataFlow拖放數據源的方式不能共享數據源,在下面ConnectionManagers中點擊新建連接時可以看到我們已經創建好的一個連接,在所有的package中都可以選擇這個連接。
下一步,新建一個指向ZipCode.txt的平面文件鏈接,在Package Designer中右擊選擇新建文件鏈接,命名為ZipCode Extract,指向連接C:\SSISDemos\ZipCode.txt。
Format下拉列表選擇默認的Delimited,Text qualifier默認選擇<none>。Text Qualifier用來設定字符串的分隔符。在文本中以逗號分隔是這個選項設置會很有用,他會忽略這些符號只抓取文本。在這個例子中文本內容沒有分隔符,所以保持默認選擇<none>。Header row delimiter選項設置為Tab{t},并選中Column names in first data row單選框,最終的界面如圖5-2

圖5-2
點擊Columns進入標簽界面,Row Delimiter默認設置{CR}{LF},意思是使用回車換行來分隔行。Column Delimiter選擇項保持默認設置Tab{t},意思是使用制表符區分列。由于選中了Column names in first data row選項所以這里看到第一行的顯示的是數據而不是列名。
點擊Advanced進入標簽界面,在這個界面中可以設置每一個列的數據類型。默認的類型是50個字符的字符串,在這個例子中比實際要長。選中ZipCode,點擊Suggest Types打開Suggest Column Types對話框,一般情況下保持默認選項,點擊OK選擇合適的類型。然后可以看到數據類型變成了two-byte signed integer [DT_I2],這種類型在一般情況下會滿足要求,如果郵編號碼以0開頭時會出現錯誤,所以點擊下拉列表框選擇string [DT_STR],OutPutColumnWidth選項設置為5,最后TextQualified選項選擇false,如圖5-3。

圖5-3
創建任務
創建好連接之后可以接著創建任務,首先在Control Flow中拖放一個Data Flow Task并重命名為Load ZipCode Info。
創建數據流
雙擊Load ZipCode Info進入Data Flow界面,在這里進行更詳細的設計。細心的話會看到在工具欄中的工具列表發生變化。
在DataFlow界面中拖放一個Flat File Source并成命名為Florida ZipCode File,雙擊打開編輯界面如圖5-4默認選中上面我們創建的連接ZipCode,點擊Columns可以看到要導出的列,點擊OK退出編輯界面。

圖5-4
下一步,拖放一個SQL Server Destination重命名為AdventureWorks,使用綠色箭頭把它和Florida ZipCode File連接起來。雙擊AdventureWorks選擇AdventureWorks數據連接,在User a table or view下拉選項中New在這里可以編寫代碼新建表而不需要在SQL Server Management Studio中新建表,修改默認的建表語句后如下:
1 CREATE TABLE [ZipCode] (
2 [Zipcode] VARCHAR(5),
3 [State] VARCHAR(2),
4 [ZipName] VARCHAR(16)
5 )
注意:如果沒有使用箭頭和上一個task連接的話,這里不能點擊New按鈕。完成建表語句之后點擊下拉列表框可以看到多了一個選項ZipCode,在Mappings標簽界面中還可以看到字段映射。SSIS總是按照名字來映射,創建的表中的字段名和數據源中的是一致的,所以看到三條平行的映射,如圖5-5

圖5-5
為使這個Package更加完整,保證每次都可以運行這個Package,回到Tontrol Flow界面拖放一個Execute SQL task,重命名為Purge ZipCode Table,雙擊打開編輯界面,在Connection下拉列表中選擇AdventureWorks連接,在SQL Statement選項中打開編輯界面輸入下面的SQL語句:
DELETE FROM ZipCode
點擊OK完成編輯,把它放在Load ZipCode Info任務的上面,使用箭頭把他們連接起來。整個Package就完成了,點擊保存按鈕,值得注意的是在這里保存的是.dtsx文件,并沒有保存到服務器中,部署package在后面的隨筆中講解。
執行包
完成編輯之后,可以點擊debug按鈕運行,或者右擊ZipCode.dtsx點擊Execute Package。在運行之前會花費幾秒鐘時間來編譯和驗證。在Output界面可以看到運行過程,然后看到task的圖標由黃變綠,證明Package執行成功。如果執行失敗在Output 界面可以看到錯誤信息。如果Output界面沒有打開可以點擊View-Other Windows Output。
在Data Flow界面會看到具體導入了多少行,界面如圖5-5。

圖5-5
這里要注意,上面創建txt文件的時候我只復制了一部分內容,如果你在自己的機器上實驗,這里應該41 rows。這里在默認情況下,在調試狀態下對Package中所做的任何修改都不會被編譯運行直到下一次運行。點擊Stop Debugging停止運行。
問題
在這里可能遇到一個問題,點擊運行的時候并沒有像上面所說的那么順利,出現了錯誤,提示如圖5-6:

圖5-6
借助強大的百度我們找到了問題的癥結和解決方案,首先把這個地址貼出來
http://support.microsoft.com/kb/2009672
- 癥狀:SSIS中創建一個包含了SQL Server Destination的數據流任務,當嘗試運行Package的時候,如果使用的是Windows7或者Vista操作系統,系統會打開UAC,是微軟為提高系統安全而在Windows Vista中引入的新技術,它要求所有用戶在標準賬號模式下運行程序和任務,阻止未認證的程序安裝,并阻止標準用戶進行不當的系統設置改變。在這種情況下你會遇到這個錯誤提示: SQL Server Destination] Error: Unable to prepare the SSIS bulk insert for data insertion.
[SSIS.Pipeline] Error: component "SQL Server Destination" failed the pre-execute phase and returned error code 0xC0202071. - 原因:在打開UAC功能的系統中,當程序如SSIS被管理員群組的用戶執行時有兩種安全令牌,一種低級別的,一種較高級別的。運行程序的時候選擇“Run as Administrator”時會使用較高級別的,默認情況下SSIS程序在連接數據庫的時候會使用低級別的。
- 解決:如果是在SQL Server Management Studio (SSMS) 或 Business Intelligence Development Studio (BIDS) 或 DTExecUI.exe中運行Package,重新代開程序并選擇Run as Administrator。如圖5-7,然后彈出詢問對話框如圖5-8,點擊Yes打開程序重新運行Package。
圖5-7
圖5-8
至此一個簡單的package就完成了,我們將txt文件中的內容導入到數據庫中,在數據庫中使用語句SELECT * FROM ZipCode就可以查出數據,他們和txt的內容是一樣的。
作者:Tyler Ning
出處:http://www.rzrgm.cn/tylerdonet/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,請微信聯系冬天里的一把火
浙公網安備 33010602011771號