問題描述:
當你把數據從其他數據庫, 或者是文本文件之類的其他數據源導入到目的數據庫時, 有時希望在導入的處理中, 能夠實現"數據存在時更新, 不存在時導入"
在之前, 一般是通過導入臨時表, 然后再判斷處理導入正式表的, 在SQL Server 2005中, SSIS可以在導入處理時直接完成這種處理.
下面具體演示一下如何用SSIS完成這樣的處理:
-- 1. 在數據庫中創建下面的對象
USE tempdb
GO
CREATE TABLE dbo.tb(
id int PRIMARY KEY,
name nvarchar(128))
GO
-- 2. 準備兩個文本文件, 放在d:"test 目錄下, 文件的內容如下
t1.txt
id name
1 張三
2 李四
t2.txt
id name
1 張三君
3 李林
4 阿聯酋
2. 創建新的 Integration Services 項目(創建SSIS包)
Ø 在“開始”菜單中,依次指向“所有程序”、“Microsoft SQL Server 2005”,再單擊 SQL Server Business Intelligence Development Studio。
Ø 在“文件”菜單中,指向“新建”,再單擊“項目”,以創建一個新的 Integration Services 項目。
Ø 在“新建項目”對話框的“模板”窗格中,選擇“Integration Services 項目”。
Ø 在“名稱”框中,將默認名稱更改為 SSIS Tutorial。或者,清除“創建解決方案的目錄”復選框。
Ø 接受默認位置,或單擊“瀏覽”,以瀏覽并找到要使用的文件夾。
Ø 在“項目位置”對話框中,單擊文件夾,再單擊“打開”。
Ø 單擊“確定”。
Ø 默認情況下,將創建一個名為 “新建包.dtsx“的空包,并將該包添加到項目中。
Ø 在解決方案資源管理器工具欄中,右鍵單擊 Package.dtsx,再單擊“重命名”,將默認包重命名為 Lesson 1.dtsx。
Ø 當系統提示重命名包對象時,單擊“是”。
3. 為SSIS包添加數據源(導入數據的源和目標數據源)
Ø 首先添加導入數據的源
Ø 右鍵單擊“連接管理器”區域中的任意位置,再單擊“新建平面文件連接”。
Ø 在“平面文件連接管理器編輯器”對話框的“連接管理器名稱”字段中,鍵入 Source。
Ø 單擊“瀏覽”。
Ø 在“打開”對話框中,瀏覽并找到“d:"test"t1.txt”文件。
Ø “常規”選項中,勾選“在第1個數據行中顯示列名稱”。
Ø “高級”選項中,選擇“id”列,將數據類型設置為“four-byte single integer[DT_I4]”。
Ø “高級”選項中,選擇“name”列,將數據類型設置為“Unicode string[DT_WSTR]”。
Ø 然后,你可以在“預覽”中查看數據是否正確。
Ø 然后添加接收數據的目的數據源
Ø 右鍵單擊連接管理器區域中的任意位置,再單擊“新建OLE DB 連接”。
Ø 在“配置OLE DB 連接管理器”對話框中,單擊“新建”。
Ø 在“服務器名稱”中,輸入localhost。
Ø 將localhost 指定為服務器名稱時,連接管理器將連接到本地計算機上Microsoft SQL Server 2005 的默認實例。若要使用SQL Server 2005 的遠程實例,請將localhost 替換為要連接到的服務器的名稱。
Ø 在“登錄到服務器”組中,確認選擇了“使用Windows 身份驗證”。
Ø 在“連接到數據庫”組的“選擇或輸入數據庫名稱”框中,鍵入或選擇tempdb。
Ø 單擊“測試連接”,驗證指定的連接設置是否有效。
Ø 單擊“確定”。
Ø 單擊“確定”。
Ø 在“配置OLE DB 連接管理器”對話框的“數據連接”窗格中,確認選擇了localhost.tempdb。
Ø 單擊“確定”。
Ø 單擊“控制流”選項卡。
Ø 在“工具箱”中,展開“控制流項”,并將一個數據流任務拖到“控制流”選項卡的設計圖面上。
Ø 在“控制流”設計圖面中,右鍵單擊新添加的數據流任務,再單擊“重命名”,將名稱更改為Import Data。
Ø 打開“數據流”設計器,方法是雙擊Import Data 數據流任務或單擊“數據流”選項卡。
Ø 在“工具箱”中,展開“數據流源”,然后將“平面文件源”拖動到“數據流”選項卡的設計圖面上。
Ø 在“數據流”設計圖面上,右鍵單擊新添加的“平面文件源”,單擊“重命名”,然后將該名稱更改為Source Data。
Ø 雙擊此平面文件源,打開“平面文件源編輯器”對話框。
Ø 在“平面文件連接管理器”框中,鍵入或選擇Source。
Ø 單擊“列”并驗證列名是否正確。
Ø 單擊“確定”。
Ø 在“工具箱”中,展開“數據流轉換”,然后將“查找”拖動到“數據流”選項卡的設計圖面上。將“查找”直接放置在Source Data 源的下面。
Ø 單擊Source Data 平面文件源,并將綠色箭頭拖動到新添加的“查找”轉換中,以連接這兩個組件。
Ø 在“數據流”設計圖面上,右鍵單擊新添加的“查找”轉換,單擊“重命名”,然后將該名稱更改為Lookup id。
Ø 雙擊Lookup id 轉換。
Ø 在“查找轉換編輯器”對話框的“OLE DB 連接管理器”框中,確保顯示localhost.tempdb。
Ø 在“使用表或視圖”框中,鍵入或選擇[dbo].[tb]。
Ø 單擊“列”選項卡。
Ø 在“可用輸入列”面板中,將id 拖放到“可用查找列”面板的id 上。
Ø 單擊“確定”。
7. 在數據流任務中添加插入數據處理需要的目標數據源
Ø 在“工具箱”中,展開“數據流目標”,并將“OLE DB 目標”拖到“數據流”選項卡的設計圖面上。將OLE DB 目標直接放置在“Lookup id”轉換的下面。
Ø 單擊“Lookup id”轉換,并將紅色箭頭拖到新添加的“OLE DB 目標”上,以便將兩個組件連接在一起。
Ø 在出現的“配置錯誤輸出”對話框中,“錯誤”列中選擇“重定向行”
Ø 單擊“確定”。
Ø 在“數據流”設計圖面上,右鍵單擊新添加的“OLE DB 目標”組件,單擊“重命名”,然后將名稱更改為Insert data。
Ø 雙擊Insert data。
Ø 在“OLE DB 目標編輯器”對話框中,確保已在“OLE DB 連接管理器”框中選中localhost.tempdb。
Ø 在“表或視圖的名稱”框中,鍵入或選擇[dbo].[tb]。
Ø 單擊“映射”。
Ø 驗證id, name 輸入列是否已正確映射到目標列。如果映射了同名列,則說明映射正確。
Ø 單擊“確定”。
8. 在數據流任務中添加更新數據處理需要的OLE DB命令組件
Ø 在“工具箱”中,展開“數據流組件轉換”,并將“OLE DB 命令”拖到“數據流”選項卡的設計圖面上。將OLE DB 目標直接放置在“Lookup id”轉換的下面。
Ø 單擊“Lookup id”轉換,并將綠色箭頭拖到新添加的“OLE DB 命令”上,以便將兩個組件連接在一起。
Ø 在“數據流”設計圖面上,右鍵單擊新添加的“OLE DB命令”組件,單擊“重命名”,然后將名稱更改為Update data。
Ø 雙擊Update data。
Ø 在“Update Data 高級編輯器”對話框中,“連接管理”選項的“連接管理器”列中,選中localhost.tempdb。
Ø 在“組件屬性”選項中,“自定義屬性”的“SQLCommand”屬性中輸入:
UPDATE dbo.tb SET name = ? WHERE id = ?
Ø 在“列映射”選項中,設置“輸入列”,將name映射到param_0,將id映射到param_1。注:param_0對應UPDAT語句中的第1個?,而param_1對應UPDATE語句中的第2個?,這是固定的。
Ø 單擊“確定”。
Ø 按“F5”執行SSIS包
Ø 執行結束(所有的組件都變為綠色),你會看到數據流向“Inset Data”的有兩條數據
Ø 雙擊“連接管理器”中的Source,重新設置文件名為D:"test"d2.txt。
Ø 單擊“確定”
Ø 按“Ctrl+Shift+F5”,重新啟動SSIS
Ø 執行結束(所有的組件都變為綠色),你會看到數據流向“Inset Data”的有兩條數據,流向“Update Data”的有1條數據
Ø 最后,在數據庫中查詢tempdb.dbo.tb,驗證數據導入的正確性
10. 添加循環,一次完成test目錄下所有文件的導入
Ø 在Business Intelligence Development Studio 中,單擊“控制流”選項卡。
Ø 在“工具箱”中,展開“控制流項”,然后將“Foreach 循環容器”拖到“控制流”選項卡的設計圖面上。
Ø 右鍵單擊新添加的“Foreach 循環容器”,并選擇“編輯”。
Ø 在“Foreach 循環編輯器”對話框的“常規”頁中,為“名稱”輸入Foreach File in Folder。單擊“確定”。
Ø 為Foreach 循環容器配置枚舉器
Ø 雙擊文件夾中的Foreach 文件以重新打開“Foreach 循環編輯器”。
Ø 單擊“集合”。
Ø 在“集合”頁中,選擇“Foreach 文件枚舉器”。
Ø 在“枚舉器配置”組中,單擊“瀏覽”。
Ø 在“瀏覽文件夾”對話框中,找到d:"test。
Ø 在“文件”框中,鍵入*.txt。
Ø 單擊“變量映射”,將枚舉器映射為用戶定義的變量。
Ø 在“變量映射”頁的“變量”列中,單擊空單元格并選擇“<新建變量…>”。
Ø 在“添加變量”對話框中,為“名稱”鍵入varFileName。
Ø 單擊“確定”。
Ø 再次單擊“確定”,退出“Foreach 循環編輯器”對話框。
Ø 將數據流任務Import Data 數據流任務拖動到現已重命名為Foreach File in Folder 的Foreach 循環容器中。
Ø 配置平面文件連接管理器以使用連接字符串的變量
Ø 在“連接管理器”窗格中,右鍵單擊Source Data,再選擇“屬性”。
Ø 在“屬性”窗口中,針對“表達式”,單擊空單元,然后單擊省略號按鈕“(…)”。
Ø 在“屬性表達式編輯器”對話框的“屬性”列中,鍵入或選擇ConnectionString。
Ø 在“表達式”列中,單擊省略號按鈕“(…)”以打開“表達式生成器”對話框。
Ø 在“表達式生成器”對話框中,展開“變量”節點。
Ø 將變量用戶::varFileName 拖到“表達式”框中。
Ø 單擊“確定”關閉“表達式生成器”對話框。
Ø 再次單擊“確定”關閉“屬性表達式編輯器”對話框。
http://dev.csdn.net/author/zjcxc/b1248376d50d41e884708d4bf09ec0af.html