いくつかの方法があります。
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 Task
flat file
staging table
2.ルックアップの使用
パッケージデザインはこんな感じ

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

2.データがロードされたときにItemMasterテーブルから生成された新しいItemIDを格納するItemID
列を作成します(NewItemIDと名付けます) 。Derived transformation
No 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 コマンドでこのプロシージャを呼び出し、出力を派生変換で作成された列にマップします。


- から行を結合するために
OLEDB command
使用した後、テーブルで同じ手順に従いますUnion ALL
matched
No Matched values
CustomerMaster

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

1.データをステージングにロードする
2. Merge
orNot Exists
を使用して、2 つのマスター テーブルに不足している値をロードします。Execute SQL Task
3. ソースをステージングとしてデータ フロー タスクを使用し、マスター テーブルで 2 つのルックアップを使用します。欠落している値はすべてマスター テーブルに既に挿入されているため、存在しませんLookup No match Output
。Lookup Match の出力を Oledb Destination (Transaction Table) に接続するだけです
私見私は1st
アプローチがなると思いますfast
。問題が発生するのは、挿入された ID を取得してターゲット テーブルにロードするために更新する必要がある 2 つのマスター テーブルがあるsynchronously
ためです。