【问题标题】:SSIS 2012 join tableSSIS 2012 连接表
【发布时间】:2015-07-19 03:56:28
【问题描述】:

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

我不知道如何获取要插入连接表的详细 ID(下例中的 StoreAddress.AddressID)。

如果我在循环中作为 T-SQL 中的存储过程执行此操作,我将在将行插入 Address 后使用 @@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

商店地址

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

我认为这应该是一个相当普遍的转换,并且在 SSIS 中有一个最佳实践来完成它。

感谢您考虑我的问题!

提姆

【问题讨论】:

    标签: sql-server ssis jointable ssis-2012


    【解决方案1】:

    首先插入不同的地址:

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

    (如果你已经有值,可能有 WHERE NOT EXISTS)

    然后使用查找来获取您的 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 中,执行数据流任务以对地址表进行排序,仅对地址列使用排序,并打开 distinct。然后,您可以使用三个查找转换执行另一个数据流任务,以获取我在上面编写的查询中的 ID。

    【讨论】:

    • 感谢您的详细解答!这肯定是比我的基于代码的循环更基于集合的 SQL 方法。但是,它似乎没有利用 SSIS 转换框架。我将把这个问题留一会儿,看看是否有其他人用 SSIS 特定的方法来回应。
    • 不错!我会尝试两者,看看哪个效果更好!
    • 此方法失败,因为有多个商店具有相同的地址。因此,AddressID 的查找失败,因为它匹配多行。
    • @TimothyVogel 您的查找不是针对您的输入,而是针对您的地址表,每个地址应该只有一次,没有提及商店。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2017-10-13
    相关资源
    最近更新 更多