我正在尝试将数据从数据库1迁移到数据库2.在数据库1中,我有TableA
有两行:Product_ID
和Product_Num
。数据库2中的TableB
包含完全相同的信息,但TableB.Product_ID
是TableA.Product_ID
的较小子集,而TableB.Product_Num
都是NULL
。我需要将Product_Num
中的TableA
Product_Num
插入TableB
Product_IDs
仅TableB
中TableA
。我可以使用简单的SQL语句迁移数据,但是,对于此项目,必须使用SSIS完成所有操作。
我已经设置了一个数据流任务,将OLE DB源(TableB
)链接到OLE DB目标(SELECT A.Product_Num FROM Database1.DBO.TableA A JOIN Database2.DBO.TableB B ON A.Product_ID = B.Product_ID
),但这就是它。我在OLE DB Source中编写了一个SQL命令(Product_Num
)并将其映射到OLE DB Destination中的JOIN
列,但{{1}}导致了一些产品。知道我能做什么吗?谢谢。
答案 0 :(得分:2)
我需要从Database1中的匹配表填充Database2中所有数据的Product_Num。
建立与Database1
和Database2
要使您当前的查询有效,您需要在Database1
和Database2
之间建立链接服务器。
另一个选项是对Database2
使用查询来生成所有需要数字的Product_ID的列表。
SELECT A.Product_ID FROM dbo.TableA AS A WHERE A.Product_Num IS NULL;
这假设您没有设置链接服务器。您在问题中使用了“加入”一词,并且有一个Merge Join
,但我不认为您在此方案中需要它。相反,您会对Lookup Component
感兴趣。在OLE DB Source之后添加其中一个并进行配置。使用Database1
连接管理器(因为它包含所需的参考数据)。根据这是2005或2008+安装,以及是否存在匹配选项,您需要处理不匹配的实体。默认情况下,查找必须为通过它的每一行找到匹配项。通常,我将此行为更改为2008年实例的Redirect no match output
或2005年的“忽略失败的查找”(近似值)。
将其保留在完全缓存中(除非该盒子缺乏内存或源表格过大)
您要编写的查询是
SELECT B.Product_Num, B.Product_ID FROM dbo.TableB AS B;
将[Product_ID]从OLE DB源(左侧)连接到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;