2012-04-16 57 views
2

我有一個如下的場景。需要基於其他列增加列值在SSIS中

像下面(XML文件)源數據::

ID  CatType   Name 
11   A    Raj 
22   A    Rai 
33   B    Raki 
44   B    Krish 
55   A    Rem 
66   B    Ram 

我不得不上面加載到下面甲酸鹽。

ID  CatType  Name  LegacyID 
1    A  Raj   11 
2    A  Rai   22 
1    B  Raki   33 
2    B  Krish   44 
3    A  Rem   55 
3    B  Ram   66 

IDCatType都在我的目標表的複合鍵。我從源獲取CatType。在加載數據時,我必須通過在目標表中選擇CatType =?(基於CatType)的最大值(ID)來增加ID 如何在SSIS中加載這些記錄,任何人都可以指向正確的方向?

+0

是的,我認爲我們可以通過控制流使用SQL任務實現。但不確定。 – 2012-04-16 18:41:28

+0

@Siva我剛剛用源數據更新了我的問題。 – 2012-04-16 18:53:09

回答

3

這裏使用SSIS 2008 R2演示你想達到什麼目的創建了一個示例SSIS包都可以做的事情。示例包將傳入文件數據加載到登臺表中。然後使用SQL Server Rank函數與Partition子句結合使用,您可以根據需要加載數據。此示例假定您的數據庫版本爲SQL Server 2005 or above。由於您沒有提供確切的XML文件格式,因此我使用CSV文件格式作爲輸入文件。

  • 我們來創建兩個樣本CSV文件Source_001.csvSource_002.csv。創建兩個文件只是爲了顯示包邏輯的工作原理。

Source_001

Source_002

  • 在SQL Server數據庫中,創建一個名爲dbo.CategoryName目標表。這是數據將被加載到的最終表格。它在列IdCatType上有複合鍵。

Destination table

  • 在SQL Server數據庫中,創建一個名爲dbo.CategoryName_Staging臨時表。這是文件數據將被暫時加載的地方。該登臺表結構模仿傳入的文件結構。

​​

  • 在SQL Server數據庫中,創建一個使用在本崗位的底部提供了存儲過程腳本部分提供的腳本命名爲dbo.PopulateDestination的存儲過程。此存儲過程使用RANK函數結合PARTITION子句來標識應分配給CatType值的正確Id。

  • 創建一個新的SSIS包。創建一個名爲SQLServer的OLE DB連接管理器。這將指向您的SQL Server數據庫。創建了一個名爲Source的平面文件連接管理器。

Connection managers

  • 配置如下所示的平面文件連接管理器。我已經把源CSV文件的路徑C:\temp\

Flat File General

  • 平面文件連接管理器編輯高級選項卡,重命名列信息。 LegacyId - 整數CatType - 串(10)Name - 串(30)的數字表示OutputColumnWidth。

flat file columns

  • 在SSIS包的控制流標籤,放置一個Execute SQL task,隨後Data Flow Task再接着另一個Execute SQL task。第一個執行SQL任務

SSIS control flow

  • 雙擊並對其進行配置,以截斷臨時表。

Truncate staging table

  • 在數據流任務雙擊切換到數據流標籤。在數據流選項卡內,放置一個平面文件源管理器來讀取CSV文件,並放置一個OLE DB目標將數據寫入登臺表。

Data flow task

  • 配置如下所示讀取用平面文件連接管理器的平面文件源平面文件源。

Flat file connection manager

Flat file columns

  • 配置,如下所示,接受輸入數據並寫入到目標文件中的OLE DB destinaton。

OLE DB connection manager

OLE DB columns

  • 回到控制流選項卡,配置,最後執行SQL任務調用新創建的存儲過程。軟件包開發現已完成。

Execute SQL task to run stored procedure

  • 執行包。請記住,該軟件包被配置爲只讀第一個源文件Source_001.csv。執行包後,查詢目標表CategoryName以查找以下數據。

Destination after first execution

  • 現在,停止SSIS包執行,在平面文件連接管理器雙擊名爲Source。將文件名路徑更改爲Source_002.csv以讀取第二個文件。

Change flat file connection file name

  • 再次執行包。該軟件包現在配置爲讀取第二個源文件Source_002.csv。該執行會將行追加到已經填充的desitnation表中。在程序包執行後,查詢目標表CategoryName以查找以下添加數據並注意Id列正確安裝。

希望有幫助。

Destination table after second execution

Stored Procedure Script

CREATE PROCEDURE [dbo].[PopulateDestination] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO dbo.CategoryName (Id, CatType, Name, LegacyId) 
    SELECT  MAXID.Id + RANK() OVER(PARTITION BY CatType ORDER BY LegacyId) Id 
      , CS.CatType 
      , CS.Name 
      , CS.LegacyId 
    FROM  dbo.CategoryName_Staging CS 
    CROSS APPLY (
        SELECT COALESCE(MAX(Id), 0) Id 
        FROM dbo.CategoryName C 
        WHERE C.CatType = CS.CatType 
       ) MAXID 
END 
+0

非常感謝Siva對於這一步一步的解釋。非常感謝它的運作良好。 :) – 2012-04-17 05:55:34

1

所以你真正需要的是創建一個基於cat類型的新ID列並將列名從ID改爲legacy ID?

如果是,您使用derived column