blog.Toby

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            130 隨筆 :: 2 文章 :: 150 評論 :: 0 Trackbacks

          當你把數據從其他數據庫, 或者是文本文件之類的其他數據源導入到目的數據庫時, 有時希望在導入的處理中, 能夠實現"數據存在時更新, 不存在時導入" 在之前, 一般是通過導入臨時表, 然后再判斷處理導入正式表的, 在SQL Server 2005中, SSIS可以在導入處理時直接完成這種處理

          問題描述:

          當你把數據從其他數據庫, 或者是文本文件之類的其他數據源導入到目的數據庫時, 有時希望在導入的處理中, 能夠實現"數據存在時更新, 不存在時導入"

          在之前, 一般是通過導入臨時表, 然后再判斷處理導入正式表的, 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 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

          Ø       單擊確定

           

          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+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
          posted on 2007-09-27 09:56 渠上月 閱讀(1492) 評論(1)  編輯  收藏 所屬分類: VS 2005

          評論

          # re: SSIS處理導入數據時, 存在的更新, 不存在的插入 2009-11-17 11:39 vc5310
          雖然寫得很詳細,但卻是一個很笨的方法!想一想merge!!
          精簡方法鏈接:
          http://hi.baidu.com/vc5310/blog/item/05d15759b8f161202934f087.html  回復  更多評論
            

          主站蜘蛛池模板: 陆良县| 寿宁县| 壤塘县| 浙江省| 葵青区| 勐海县| 临桂县| 碌曲县| 贵南县| 南漳县| 松滋市| 顺义区| 高平市| 长寿区| 原平市| 乌鲁木齐县| 留坝县| 华容县| 宿迁市| 高唐县| 乌拉特后旗| 石泉县| 汕头市| 盐城市| 洪雅县| 崇信县| 积石山| 上杭县| 博白县| 北流市| 富宁县| 门头沟区| 仙居县| 鹤山市| 常宁市| 永修县| 虎林市| 大港区| 德惠市| 邳州市| 阿坝县|