問題描述 :
當你把數據從其他數據庫 , 或者是文本文件之類的其他數據源導入到目的數據庫時 , 有時希望在導入的處理中 , 能夠實現 " 數據存在時更新 , 不存在時導入 "
在之前 , 一般是通過導入臨時表 , 然后再判斷處理導入正式表的 , 在 SQL Server 2005 中 , SSIS 可以在導入處理時直接完成這種處理 .
下面具體演示一下如何用 SSIS 完成這樣的處理 :
1. 準備測試環境
-- 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 <chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="2005" unitname="”"><font face="Times New Roman">2005</font><span lang="EN-US" style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span lang="EN-US">”</span></span></chmetcnv> ,再單擊 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 。
? 單擊 “ 確定 ” 。
4. 為 SSIS 包添加數據流任務
? 單擊“控制流”選項卡。
? 在“工具箱”中,展開“控制流項”,并將一個數據流任務拖到“控制流”選項卡的設計圖面上。
? 在“控制流”設計圖面中,右鍵單擊新添加的數據流任務,再單擊“重命名”,將名稱更改為 Import Data 。
5. 在數據流任務中設置數據流源
? 打開“數據流”設計器,方法是雙擊 Import Data 數據流任務或單擊 “ 數據流 ” 選項卡。
? 在 “ 工具箱 ” 中,展開 “ 數據流源 ” ,然后將 “ 平面文件源 ” 拖動到 “ 數據流 ” 選項卡的設計圖面上。
? 在 “ 數據流 ” 設計圖面上,右鍵單擊新添加的 “ 平面文件源 ” ,單擊 “ 重命名 ” ,然后將該名稱更改為 Source Data 。
? 雙擊此平面文件源,打開 “ 平面文件源編輯器 ” 對話框。
? 在 “ 平面文件連接管理器 ” 框中,鍵入或選擇 Source 。
? 單擊 “ 列 ” 并驗證列名是否正確。
? 單擊 “ 確定 ” 。
6. 在數據流任務中添加查找處理組件
? 在“工具箱”中,展開“數據流轉換”,然后將“查找”拖動到“數據流”選項卡的設計圖面上。將“查找”直接放置在 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 個 ? ,這是固定的。
? 單擊 “ 確定 ” 。
9. 測試
? 按“ F5 ”執行 SSIS 包
? 執行結束(所有的組件都變為綠色),你會看到數據流向“ Inset Data” 的有兩條數據
? 雙擊“連接管理器”中的 Source ,重新設置文件名為 D:\test\d2.txt 。
? 單擊“確定”
? 按“ Ctrl+Shift+F<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5" unitname="”"><font face="Times New Roman">5</font><span lang="EN-US" style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span lang="EN-US">”</span></span></chmetcnv> ,重新啟動 SSIS
? 執行結束(所有的組件都變為綠色),你會看到數據流向“ Inset Data” 的有兩條數據,流向“ Update Data ”的有 1 條數據
? 最后,在數據庫中查詢 tempdb.dbo.tb ,驗證數據導入的正確性
10. 添加循環,一次完成 test 目錄下所有文件的導入
<span style=
發表評論
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

評論