我在flat file
中有一个交易表,如
ItemID ,ItemName ,CustomerID ,CustomerName ,Qty ,Price ,TotalValue
和target
交易表将有
ItemID,CustomerID,Qty,Price,TotalValue
现在我必须使用SSIS包
将其导入到transaction表中但在导入ItemID
和CustomerID
之前,我应该查看lookup
表格ItemMaster
和CustomerMaster
,如果没有,那么我会插入新的元组进入表并获取新的itemID
或customerID
并将事务导入事务表。可以使用SSIS中的查找转换来完成。
或者最好使用SSIS包将事务导入临时表,在临时表中更新新的ItemIDs
和customer IDs
,然后将临时表中的事务插入到主事务表< / p>
明智的表现哪个选项更好?
答案 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.使用查找
包装设计看起来像
如果不允许在数据库中创建登台表,则应采用此方法。由于阻塞组件(Union ALL)和OlEDB命令(RBAR问题(通过痛苦的行排)问题,这将会很慢)
步骤: -
1.将lookup
与ItemMaster
表
2.使用ItemID
创建Derived transformation
列(将其命名为NewItemID),该列将存储在加载数据时从ItemMaster表生成的新ItemID .join使用{{1查找派生转换}}
3.应将No Matched值插入ItemMaster表中。为此,我们创建一个插入数据的过程,并将ItemID值检索为No Match Output
Output
3.在OLEDB命令中调用此过程,并使用Derived transformation
中创建的列映射输出
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 ALL
和matched
之后的行,然后再次使用No Matched values
表
3. CustomerMaster
Transforming procedure
逻辑
包装设计
1.将数据载入暂存
2.使用SSIS
或Merge
并使用Not Exists
3.使用数据流任务,将源作为分段,使用主表进行2次查找。由于所有缺失的值都已插入主表,因此不会有任何Execute SQL Task
。只需将查找匹配输出与Oledb目标(事务表)
恕我直言,我认为Lookup No match Output
方法将是1st
。出现这个问题的原因只是因为有两个主表需要一起更新才能获得插入的ID并将其加载到目标表中。所以这样做fast
很困难。