SSIS 2012联接表

时间:2015-07-19 03:56:28

标签: sql-server ssis jointable ssis-2012

我需要获取非规范化数据并创建规范化表。

我无法弄清楚如何获取要插入连接表的详细ID(下例中的StoreAddress.AddressID)。

如果我在循环中将其作为T-SQL中的存储过程执行,我会在地址中插入行以获取密钥后使用@@ IDENTITY,然后使用它插入StoreAddress。我无法弄清楚如何在SSIS 2012中使用变换。

以商店和地址为例。

输入数据如下:

Store, Type, Address1, City, State
1, P, 123 Main, Central, PA
1, M, 123 Second, Central, PA   
2, P, 123 Third, Pokono, NY
2, M, 123 Third, Pokono, NY

目的地表是: 存储(已填充在不同的数据流中)

StoreID, StoreName, StoreNumber
9878, Main street, 1
561, Mountain View, 2

AddressType(已在不同的数据流中填充)

AddressTypeID, Code, Description
1, P, Physical
2, M, Mailing
3, O, Other

地址

AddressID, Addr1, City, State
721, 123 Main, Central, PA
843, 123 Second, Central, PA
1098, 123 Third, Pokono, NY

StoreAddress

StoreID, AddressID, AddressTypeID
9878, 721, 1
9878, 843, 2
561, 1098, 1
561, 1098, 2

我认为这应该是一个相当普遍的转变,并且最好在SSIS中实现它。

感谢您思考我的问题!

1 个答案:

答案 0 :(得分:2)

首先插入不同的地址:

INSERT dbo.Address (Addr1, City, State)
SELECT DISTINCT Address1, City, State
FROM input;

(如果你已经有价值,可能还有什么不存在)

然后使用查找来获取StoreAddress表的值。

INSERT dbo.StoreAddress (StoreId, AddressId, AddressTypeID)
SELECT
  (SELECT s.StoreId from dbo.Store AS s
    WHERE s.StoreNumber = i.Store)
, (SELECT a.AddressId FROM dbo.Address AS a
    WHERE a.Addr1 = i.Address1
    AND a.City = i.City
    AND a.State = i.State)
, (SELECT at.AddressTypeId 
   FROM dbo.AddressType AS at
   WHERE at.Code = i.Type)
FROM input AS i;

使用像这样的子查询就像使用连接一样,但更安全,因为你不会影响input中的行数。

在纯SSIS中,执行数据流任务以对地址表进行排序,仅使用地址列上的排序,并打开明显。然后,您可以使用三个Lookup转换执行另一个数据流任务,以获取上面我写的查询中的ID。