2012-04-16 15 views
2

私は以下のようなシナリオを持っています。以下のような他の列に基づいて列の値を増やす必要があります。

ソースデータ(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をソースから取得しています。データをロードする際、DestinationテーブルのCatType =?(CatTypeに基づいて)Max(ID)を選択してIDを増やす必要があります SSISでこれらのレコードをロードするにはどうすればいいですか?

+0

はい、私たちは、制御フローにSQLタスクを使用することによって達成できると思っています。しかし確かではない。 –

+0

@Siva私はソースデータで質問を更新しました。 –

答えて

3

を使用して、両方のことを行うことができますあなたが達成しようとしている内容を示しSSIS 2008 R2を使用して作成したサンプルSSISパッケージです。サンプルパッケージは、受信ファイルデータをステージングテーブルにロードします。次に、Partition句と組み合わせてSQL Server Rank関数を使用すると、要件に従ってデータをロードできます。このサンプルでは、​​データベースのバージョンがSQL Server 2005 or aboveであることを前提としています。あなたは正確なXMLファイル形式を提供していないので、私は入力ファイルとしてCSVファイル形式を使用しました。

  • のはSource_001.csvSource_002.csvという名前の2つのサンプルCSVファイルを作成してみましょう。パッケージロジックが動作することを示すために2つのファイルが作成されました。 SQL Serverデータベースで

    Source_002

    • Source_001

  • は、 dbo.CategoryNameという名前の送信先テーブルを作成します。これは、データがロードされる最後のテーブルです。列 IdCatTypeに複合キーがあります。 SQL Serverデータベースで

Destination table

  • dbo.CategoryName_Stagingという名前のステージング表を作成します。これはファイルデータが一時的に読み込まれる場所です。このステージングテーブル構造は、受信ファイル構造を模倣しています。 SQL Serverデータベースで​​

  • は、この記事の下で提供手順スクリプトストアドセクション で提供されるスクリプトを使用してdbo.PopulateDestinationという名前のストアドプロシージャを作成します。このストアドプロシージャは、RANK関数とPARTITIONという句を組み合わせて使用​​し、CatType値に割り当てる必要がある正しいIDを識別します。

  • 新しいSSISパッケージを作成します。 SQLServerという名前のOLE DB接続マネージャを作成します。これは、SQL Serverデータベースを指します。 Sourceという名前のフラットファイル接続マネージャを作成しました。

Connection managers

  • 以下に示すようにフラットファイル接続マネージャを設定します。私は、列情報の名前を変更、フラットファイル接続マネージャエディタ高度タブでパスC:\temp\

Flat File General

  • ソースcsvファイルを置いていました。 LegacyId - 整数CatType - 文字列(10)は、Name - ストリング(30)数字はOutputColumnWidthを示します。 SSISパッケージの制御フロー]タブでflat file columns

  • Execute SQL taskData Flow Taskが続き、その後、別の Execute SQL task続くを配置します。

SSIS control flow

  • 最初のSQL実行タスクをダブルクリックして、ステージング表を切り捨てるように設定します。

Truncate staging table

  • データフロー]タブに切り替えるにはデータフロータスクをダブルクリックします。データフロータブ内で、フラットファイルソースマネージャを配置してCSVファイルを読み込み、OLE DB宛先を配置してデータをステージングテーブルに書き込みます。

Data flow task

  • フラットファイル接続マネージャを使用して、フラット・ファイル・ソースを読み取るために、以下に示すようにフラット・ファイル・ソースを構成します。

    Flat file columns

    • 設定入力データを受け入れて、デスティネーションファイルに書き込むために、以下に示すように、OLE DBのdestinaton

      Flat file connection manager

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という名前のフラットファイル接続マネージャをダブルクリックします。 2番目のファイルを読み取るには、ファイル名のパスをSource_002.csvに変更します。

Change flat file connection file name

  • パッケージを再度実行してください。パッケージは、2番目のソースファイルSource_002.csvを読み取るように設定されました。この実行は、すでに入力されている表テーブルに行を追加します。パッケージの実行後、宛先テーブル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

シヴァありがとうございました。おかげで多くの作業良い。 :) –

1

本当に必要なのは、cat型に基づいて新しいID列を作成し、列名をIDからレガシーIDに変更することです。

そうならば、あなたはここでderived column

関連する問題