有几种方法可以做到这一点。
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 而不是 MergeNOT EXISTS
Insert into ItemMaster
Select ItemName from stgTransaction s
where not exists
(Select 1 from ItemMaster im
where im.ItemName = s.ItemName
);
插入missing
值后,只需将 staging 表与 2 个master
表连接起来,然后将其插入target
.
将上面的查询包装成 a并在( 加载数据 from到)procedure
之后调用该过程Data Flow Task
flat file
staging table
2.使用查找
包装设计看起来像
如果不允许在数据库中创建临时表,则应该采用这种方法。由于阻塞组件(Union ALL)和 OlEDB 命令(RBAR 问题(逐行痛苦)问题),这将很慢
步骤:- 1.lookup
与ItemMaster
表一起使用
2.创建一个ItemID
列(将其命名为NewItemID),使用Derived transformation
它将存储加载数据时从ItemMaster表生成的新ItemID。使用派生转换加入查找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.将数据加载到staging中
2.使用Merge
或Not Exists
加载2个主表中的缺失值Execute SQL Task
3.使用数据流任务,源为暂存,2次查找主表。由于所有缺失值都已插入到主表中,所以不会有任何缺失值Lookup No match Output
。只需将 Lookup Match 输出与 Oledb Destination (Transaction Table) 连接起来
恕我直言,我认为这种1st
方法将是fast
。问题的出现只是因为有 2 个主表需要更新,同时获取插入的 ID 并将其加载到目标表中。所以这样做很synchronously
困难。