2

我有一个flat file类似的交易表

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

target事务表将有

ItemID,CustomerID,Qty,Price,TotalValue

现在我必须使用 SSIS 包将其导入事务表

但是在导入之前ItemIDCustomerID我应该查看lookupItemMasterCustomerMaster如果没有,那么我已经将新元组插入到表中,并采用新的itemIDorcustomerID并将事务导入事务表。它可以使用 SSIS 中的查找转换来完成。

还是使用 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 而不是 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 Taskflat filestaging table

2.使用查找

包装设计看起来像

在此处输入图像描述

如果不允许在数据库中创建临时表,则应该采用这种方法。由于阻塞组件(Union ALL)和 OlEDB 命令(RBAR 问题(逐行痛苦)问题),这将很慢

步骤:- 1.lookupItemMaster表一起使用

在此处输入图像描述

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 命令中调用此过程,并将输出与派生转换中创建的列映射

在此处输入图像描述

在此处输入图像描述

  1. OLEDB command使用Union ALL合并行之后matchedNo Matched values然后再次按照与CustomerMaster表相同的过程

在此处输入图像描述

3.最后一个选项是Transforming procedure逻辑SSIS

包装设计是

在此处输入图像描述

1.将数据加载到staging中

2.使用MergeNot Exists加载2个主表中的缺失值Execute SQL Task

3.使用数据流任务,源为暂存,2次查找主表。由于所有缺失值都已插入到主表中,所以不会有任何缺失值Lookup No match Output。只需将 Lookup Match 输出与 Oledb Destination (Transaction Table) 连接起来

恕我直言,我认为这种1st方法将是fast。问题的出现只是因为有 2 个主表需要更新,同时获取插入的 ID 并将其加载到目标表中。所以这样做很synchronously困难。

于 2013-05-17T11:05:20.600 回答