【问题标题】:How to join tables in two different databases during data migration using SSIS如何在使用 SSIS 进行数据迁移期间连接两个不同数据库中的表
【发布时间】:2013-09-24 04:03:00
【问题描述】:

我正在尝试将数据从数据库 1 迁移到数据库 2。在数据库 1 中,我有两行 TableAProduct_IDProduct_Num。数据库 2 中的 TableB 包含完全相同的信息,只是 TableB.Product_IDTableA.Product_ID 的较小子集,TableB.Product_Num 都是 NULL。我需要将TableA 中的Product_Num 插入TableB 中的Product_Num,仅适用于Product_IDs 中存在的Product_IDs。我可以使用简单的 SQL 语句迁移数据,但是,对于这个项目,一切都必须使用 SSIS 完成。

我已经设置了一个将 OLE DB 源 (TableA) 链接到 OLE DB 目标 (TableB) 的数据流任务,但仅此而已。我在 OLE DB Source 中编写了一个 SQL 命令 (SELECT A.Product_Num FROM Database1.DBO.TableA A JOIN Database2.DBO.TableB B ON A.Product_ID = B.Product_ID),并将其映射到 OLE DB Destination 中的 Product_Num 列,但 JOIN 导致了一些产品。知道我能做什么吗?谢谢。

【问题讨论】:

    标签: sql sql-server database ssis


    【解决方案1】:

    问题重述

    我需要从 Database1 中的匹配表中为 Database2 中的所有数据填充 Product_Num。

    连接管理器

    建立到 Database1Database2 的 OLE DB 连接

    获取数据

    要使您当前的查询正常工作,您需要在Database1Database2 之间建立一个链接服务器。

    另一种选择是对Database2 使用查询来生成所有需要数字的Product_ID 列表。

    从 dbo.TableA 中选择 A.Product_ID 作为 A.Product_Num 为 NULL;

    添加缺失的数据

    这假设您没有设置链接服务器。您在问题中使用了“加入”一词,并且有一个 Merge Join,但我认为您在这种情况下不需要它。相反,您会对Lookup Component 感兴趣。在 OLE DB Source 之后添加其中之一并对其进行配置。使用Database1 连接管理器(因为它包含所需的参考数据)。根据这是 2005 还是 2008+ 安装,以及是否存在不匹配的选项,您将需要处理不匹配的实体。默认情况下,查找必须为通过它的每一行找到匹配项。一般来说,我将此行为更改为 Redirect no match output 用于 2008 年以上的实例或“忽略失败的查找”(近似值)用于 2005 年。

    将其保留在 Full Cache 中(除非该框内存不足或源表过大)

    您要编写的查询是

    SELECT B.Product_Num, B.Product_ID FROM dbo.TableB AS B;
    

    将 OLE DB 源(左侧)中的 [Product_ID] 连接到 Lookup(右侧)中的 [Product_ID] 并检查 Product_Num。

    更新数据

    此时,您的数据流中有两列,来自 B 的 Product_ID 和来自 A 的相应 Product_Num。SSIS 面临的挑战是更新并不真正存在。 SSIS 被设计为插入重,它的行为就像一个冠军。然而,更新默认是单例操作。更新行、更新行、更新行...与所需的基于集合的插入方法进行对比(boom 添加了 100000 行,boom 添加了另外 N 行)

    开箱即用的方法是使用 OLE DB Command 对象并在那里编写更新语句。对于 10、100、1000 次更新,这可能没什么。更新一百万行?这种方法不会扩大规模。

    大容量更新的方法是将 SSIS 用于它真正擅长的事情(插入)针对临时表,然后针对目标表执行基于集合的更新(执行 SQL 任务)的发布数据流步骤暂存表。这假设您能够在目标服务器上创建表。我从事的一些工作不是一个选择。

    UPDATE B 
    SET 
        Product_Num = S.Product_Num 
    FROM 
        Stage.TableC S 
        INNER JOIN 
            dbo.TableB B 
            ON B.Product_ID = S.Product_ID 
    WHERE 
        B.Product_Num IS NULL;
    

    【讨论】:

    • 您好 billinkc,感谢您的及时回复。我可能应该提到我确实建立了一个链接服务器。
    • Havong 链接服务器可能违反了您的声明“对于这个项目,一切都必须使用 SSIS 完成。”但无论如何,这是一个毫无意义的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    相关资源
    最近更新 更多