2

flat file同様のトランザクションテーブルがあります

ItemID ,ItemName ,CustomerID ,CustomerName ,Qty ,Price ,TotalValue

そしてtargetトランザクションテーブルは

ItemID,CustomerID,Qty,Price,TotalValue

次に、SSIS パッケージを使用してトランザクション テーブルにインポートする必要があります。

しかし、インポートする前ItemIDにテーブルをCustomerID調べて、そこにない場合は、新しいタプルをテーブルに挿入し、新しいものを取得するか、トランザクションをトランザクション テーブルにインポートします。これは、SSIS のルックアップ変換を使用して実行できます。lookupItemMasterCustomerMasteritemIDcustomerID

または、SSISパッケージを使用してトランザクションを一時テーブルにインポートし、一時テーブルで新規ItemIDsおよび更新を更新customer IDsしてから、一時テーブルからメイントランザクションテーブルにトランザクションを挿入する方が良いですか?

パフォーマンスの点でどちらのオプションが優れていますか?

4

1 に答える 1

1

いくつかの方法があります。

1.ステージングテーブルの使い方

2.ルックアップの使用

3.SSIS でのストアド プロシージャ ロジックの変換

1.Using Staging Table

すべてのフラット ファイル データをステージング テーブルにダンプしますStgTransaction

 Merge ItemMaster target
 using StgTransaction src
 on target.ItemID = src.ItemID
 WHEN NOT MATCHED  THEN 
 INSERT (ItemName)
 values (src.ItemID);

 Merge CustomerMaster target
 using Trans src
 on target.CustomerID = Src.CustomerID
 WHEN NOT MATCHED  THEN 
 INSERT (CustomerName)
 values (src.CustomerID);

with cte(ItemID ,ItemName ,CustomerID ,CustomerName ,Qty ,Price ,TotalValue) as 
 (
    Select I.ItemID,I.ItemName,
               C.CustomerID,C.CustomerName,
               f.Qty,f.price,f.TotalValue
    from ItemMaster I inner join Trans f
     on I.ItemName = f.ItemName
    inner join CustomerMaster c
    on c.CustomerName = f.CustomerName
)
Insert into Transactions
Select ItemID ,ItemName ,CustomerID ,CustomerName ,Qty ,Price ,TotalValue
from cte

基本的に、Merge Syntax を使用して、欠落しているすべての値を2つのマスターテーブルに挿入しています。 Merge の代わりに使用できますNOT EXISTS

 Insert into ItemMaster 
 Select ItemName from stgTransaction s
 where not exists 
              (Select 1 from ItemMaster im 
               where im.ItemName = s.ItemName
              );

値が挿入されたら、missingステージング テーブルを 2 つのテーブルに結合し、masterそれを に挿入しtargetます。

上記のクエリを にラップし、 (データを から にロードする)のprocedure後にプロシージャを呼び出します。Data Flow Taskflat filestaging table

2.ルックアップの使用

パッケージデザインはこんな感じ

ここに画像の説明を入力

データベースにステージング テーブルを作成することが許可されていない場合は、この方法を使用する必要があります。コンポーネントのブロック (Union ALL) と OlEDB コマンド (RBAR の問題 (行による行のアゴナイジングの問題) により、これは遅くなります。

手順 :- 1.テーブルlookupで使用するItemMaster

ここに画像の説明を入力

2.データがロードされたときにItemMasterテーブルから生成された新しいItemIDを格納するItemID列を作成します(NewItemIDと名付けます) 。Derived transformationNo Match Output

ここに画像の説明を入力

3. No Matched 値を ItemMaster テーブルに挿入する必要があります。このために、データを挿入して ItemID 値を取得するプロシージャを作成します。Output

 ALTER PROCEDURE usp_InsertMaster
 @ItemName AS varchar(20),
 @id AS INT OUTPUT AS
 INSERT INTO ItemMaster
 (ItemName) 
  VALUES 
 (@ItemName)
 SET @id = SCOPE_IDENTITY()  
 //If your using ID as Identity value else use Output clause to retrieve the ID

3. OLEDB コマンドでこのプロシージャを呼び出し、出力を派生変換で作成された列にマップします。

ここに画像の説明を入力

ここに画像の説明を入力

  1. から行を結合するためにOLEDB command使用した後、テーブルで同じ手順に従いますUnion ALLmatchedNo Matched valuesCustomerMaster

ここに画像の説明を入力

3.最後のオプションはTransforming procedureロジックインですSSIS

パッケージデザインは

ここに画像の説明を入力

1.データをステージングにロードする

2. MergeorNot Existsを使用して、2 つのマスター テーブルに不足している値をロードします。Execute SQL Task

3. ソースをステージングとしてデータ フロー タスクを使用し、マスター テーブルで 2 つのルックアップを使用します。欠落している値はすべてマスター テーブルに既に挿入されているため、存在しませんLookup No match Output。Lookup Match の出力を Oledb Destination (Transaction Table) に接続するだけです

私見私は1stアプローチがなると思いますfast。問題が発生するのは、挿入された ID を取得してターゲット テーブルにロードするために更新する必要がある 2 つのマスター テーブルがあるsynchronouslyためです。

于 2013-05-17T11:05:20.600 に答える