问题重述
我需要从 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;