在SSIS中导入时将行插入其他表

时间:2013-05-17 07:49:52

标签: sql-server-2008 ssis multiple-tables

我在flat file中有一个交易表,如

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

target交易表将有

ItemID,CustomerID,Qty,Price,TotalValue

现在我必须使用SSIS包

将其导入到transaction表中

但在导入ItemIDCustomerID之前,我应该查看lookup表格ItemMasterCustomerMaster,如果没有,那么我会插入新的元组进入表并获取新的itemIDcustomerID并将事务导入事务表。可以使用SSIS中的查找转换来完成。

或者最好使用SSIS包将事务导入临时表,在临时表中更新新的ItemIDscustomer IDs,然后将临时表中的事务插入到主事务表< / p>

明智的表现哪个选项更好?

1 个答案:

答案 0 :(得分: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语法将所有缺失的值插入到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.使用查找

包装设计看起来像

enter image description here

如果不允许在数据库中创建登台表,则应采用此方法。由于阻塞组件(Union ALL)和OlEDB命令(RBAR问题(通过痛苦的行排)问题,这将会很慢)

步骤: - 1.将lookupItemMaster

一起使用

enter image description here

2.使用ItemID创建Derived transformation列(将其命名为NewItemID),该列将存储在加载数据时从ItemMaster表生成的新ItemID .join使用{{1查找派生转换}}

enter image description here

3.应将No Matched值插入ItemMaster表中。为此,我们创建一个插入数据的过程,并将ItemID值检索为No Match Output

Output

3.在OLEDB命令中调用此过程,并使用Derived transformation

中创建的列映射输出

enter image description here

enter image description here

  1. 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 使用OLEDB command合并Union ALLmatched之后的行,然后再次使用No Matched values
  2. 执行相同的操作>

    enter image description here

    3. CustomerMaster

    中的最后一个选项是Transforming procedure逻辑

    包装设计

    enter image description here

    1.将数据载入暂存

    2.使用SSISMerge并使用Not Exists

    在2个主表中加载缺失的值

    3.使用数据流任务,将源作为分段,使用主表进行2次查找。由于所有缺失的值都已插入主表,因此不会有任何Execute SQL Task。只需将查找匹配输出与Oledb目标(事务表)

    连接即可

    恕我直言,我认为Lookup No match Output方法将是1st。出现这个问题的原因只是因为有两个主表需要一起更新才能获得插入的ID并将其加载到目标表中。所以这样做fast很困难。