0

我正在尝试将数据从数据库 1 迁移到数据库 2。在数据库 1 中,我有TableA两行:Product_IDProduct_Num. 在数据库 2 中,除了 是和are all的一个较小子集之外,它TableB包含完全相同的信息。我只需要将from插入in中的那些存在于. 我可以使用简单的 SQL 语句迁移数据,但是,对于这个项目,一切都必须使用 SSIS 完成。TableB.Product_IDTableA.Product_IDTableB.Product_NumNULLProduct_NumTableAProduct_NumTableBProduct_IDsTableB

我已经设置了一个将 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) 并将其映射到Product_NumOLE DB Destination 中的列,但这JOIN会导致某些产品。知道我能做什么吗?谢谢。

4

1 回答 1

2

问题重述

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

连接管理器

Database1建立与和的 OLE DB 连接Database2

获取数据

为了使您当前的查询正常工作,您需要在Database1和之间建立一个链接服务器Database2

另一种选择是使用查询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 被设计为插入重,它的行为就像一个冠军。然而,更新默认是单例操作。更新行,更新行,更新行...与所需的基于集合的插入方法进行对比(增加了100000行,增加了另外N 行)

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

大容量更新的方法是使用 SSIS 来针对临时表执行它真正擅长的操作(INSERT),然后针对临时表中的目标表执行基于集合的 UPDATE(执行 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;
于 2013-09-23T20:03:00.450 回答