3

以下のようなシナリオがあります。

以下のようなソース データ (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 テーブルで Max(ID) where CatType= ?(CatType に基づく) を選択して ID をインクリメントする必要があります。これらのレコードを SSIS にロードするにはどうすればよいですか?

4

2 に答える 2

3

を使用して作成されたサンプル SSIS パッケージを次にSSIS 2008 R2示します。これは、達成しようとしていることを示しています。サンプル パッケージは、受信ファイル データをステージング テーブルに読み込みます。次に、句RankとともにSQL Server 関数を使用して、要件に応じてデータをロードできます。Partitionこのサンプルでは、​​データベースのバージョンがSQL Server 2005 or above. 正確な XML ファイル形式が提供されていないため、入力ファイルとして CSV ファイル形式を使用しました。

  • Source_001.csvとという名前の 2 つのサンプル CSV ファイルを作成しましょうSource_002.csv。パッケージ ロジックの動作を示すためだけに 2 つのファイルが作成されました。

ソース_001

ソース_002

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

宛先表

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

ステージング テーブル

  • SQL Server データベースで、この投稿の下部にあるストアド プロシージャ スクリプトdbo.PopulateDestinationのセクションで提供されているスクリプトを使用して名前を付けたストアド プロシージャを作成します。このストアド プロシージャは、関数を句と組み合わせて使用​​し、CatType 値に割り当てる必要がある正しい Id を識別します。RANKPARTITION

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

接続マネージャー

  • 以下に示すように、フラット ファイル接続マネージャーを構成します。ソースcsvファイルをパスに配置しましたC:\temp\

フラットファイル全般

  • フラット ファイル接続マネージャー エディターの[詳細設定] タブで、列情報の名前を変更します。-整数、-文字列 (10)、-文字列 (30)数値は OutputColumnWidth を示します。LegacyIdCatTypeName

フラットファイル列

  • SSIS パッケージの [制御フロー] タブで、 を配置しExecute SQL task、その後に を配置しData Flow Task、その後に別の を配置しExecute SQL taskます。

SSIS 制御フロー

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

ステージング テーブルの切り捨て

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

データ フロー タスク

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

フラット ファイル接続マネージャー

フラットファイル列

  • 以下に示すように、受信データを受け入れて宛先ファイルに書き込むように、OLE DB 宛先を構成します。

OLE DB 接続マネージャー

OLE DB 列

  • [制御フロー] タブに戻り、最後の SQL 実行タスクを構成して、新しく作成されたストアド プロシージャを呼び出します。パッケージの開発はこれで完了です。

SQL タスクを実行してストアド プロシージャを実行する

  • パッケージを実行します。パッケージは、最初のソース ファイルSource_001.csvのみを読み取るように構成されていることに注意してください。パッケージの実行後、宛先テーブルに対してクエリを実行CategoryNameして、次のデータを見つけます。

最初の実行後の宛先

  • ここで、SSIS パッケージの実行を停止し、という名前のフラット ファイル接続マネージャーをダブルクリックしますSourceSource_002.csv2 番目のファイルを読み取るために、ファイル名のパスを に変更します。

フラットファイル接続ファイル名の変更

  • パッケージを再度実行します。これで、2 番目のソース ファイルSource_002.csvを読み取るようにパッケージが構成されました。この実行により、すでに入力されている宛先テーブルに行が追加されます。パッケージの実行後、宛先テーブルにクエリを実行しCategoryNameて次の追加データを検索し、Id 列が正しく入力されていることを確認します。

それが役立つことを願っています。

2 回目の実行後の宛先テーブル

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
于 2012-04-16T21:34:22.350 に答える
1

本当に必要なのは、猫の種類に基づいて新しい ID 列を作成し、列名を ID から従来の ID に変更することですか?

はいの場合、派生列を使用して両方のことを行うことができます

于 2012-04-16T20:47:25.003 に答える