如何在使用SSIS进行数据迁移期间将表连接到两个不同的数据库中

时间:2013-09-23 19:38:27

标签: sql sql-server database ssis

我正在尝试将数据从数据库1迁移到数据库2.在数据库1中,我有TableA有两行:Product_IDProduct_Num。数据库2中的TableB包含完全相同的信息,但TableB.Product_IDTableA.Product_ID的较小子集,而TableB.Product_Num都是NULL。我需要将Product_Num中的TableA Product_Num插入TableB Product_IDsTableBTableA。我可以使用简单的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}}导致了一些产品。知道我能做什么吗?谢谢。

1 个答案:

答案 0 :(得分:2)

问题重新陈述

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

连接管理器

建立与Database1Database2

的OLE DB连接

获取数据

要使您当前的查询有效,您需要在Database1Database2之间建立链接服务器。

另一个选项是对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;