2014-07-18 38 views
0

我试图从2个不同服务器上的2个数据库合并2个表。从2个数据库合并sql语句

现在,我创建了一个服务器链接的服务器,我用这样的查询:

MERGE INTO tablename1 as T1 
using linkedservername.dbname.tablename2 as T2 ON 
WHEN MATCHED THEN 
    UPDATE SET ... 
WHEN NOT MATCHED THEN 
    INSERT ... 

我想知道是否有一个解决方案,并且不用创建链接的服务器。

+1

复制是您的选择吗? –

+0

不幸的不是。我在SSIS包中使用此查询,并且2个表的结构不相同。 –

+0

会[此](http://msdn.microsoft.com/en-us/library/ms187569.aspx)有用吗?主题是:_Ad Hoc分布式查询_ –

回答

0

在SSIS中有三种常用的方法可以做到这一点。但是,如果您在线查询,则有更多信息。

无论哪种方式,您首先需要在SSIS中创建连接管理器,直接指向您的链接服务器。从那开始。

然后创建一个数据流任务,你select from dbname.tablename2在数据流源

然后你就可以做到这一点的几种方法:

A.临时表

转储导致到一个临时表然后在后续的SQL Task中本地运行您的合并语句。除非您不允许在目标中创建表格/数据,否则这通常是最快(最简单)的方式。

B.查找

使用查找在您的数据流,以确定如果记录存在与否,其次是OLEDB目标(插入)或OLEDB命令(更新)

这是通常速度较慢,因为查找和更新效率都不高。

C.行级合并

饲料结果为OLEDB命令,并直接把你的合并在那里

这可能是最慢的。

如果您需要更多信息,请将您的连接管理器分类并回传。

+0

我已经尝试了所有这些ssis解决方案,并且他们对于大桌子来说太慢了。我创建了使用sql merge语句的自定义任务ssis,它工作正常。但我有义务创建一个链接的数据库,当我的2个表不在同一台服务器上时。因此我的问题。 –

+0

你尝试了分阶段的方法(1)吗?这应该是最快的。在本地分级所有数据。运行一个更新查询和一个插入查询。为您插入和更新优化索引 –

+0

对不起,但我的问题不是“如何在ssis中做到这一点”。我知道如何在ssis中做到这一点,谢谢。我不知道是谁给我的问题添加了标志ssis,但这是一个错误。我只关心sql语句的问题。 –