如何跨多个数据库服务器使用 MERGE 语句?

Posted

技术标签:

【中文标题】如何跨多个数据库服务器使用 MERGE 语句?【英文标题】:How can I use MERGE statement across multiple database servers? 【发布时间】:2013-02-25 12:27:48 【问题描述】:

我的源表和目标表存在于不同的服务器上。我正在使用 Execute SQL Task 编写合并语句来同步它们。

谁能解释我如何引用我的 Execute SQL Task 内不同服务器上存在的两个不同数据库?

【问题讨论】:

以上答案是所提问题的正确答案(恕我直言),但应作为答案输入,而不是评论。 【参考方案1】:

可能的方法:

我建议使用以下方法,而不是尝试在两个数据库服务器之间的 Execute SQL Task 中使用 MERGE 语句。

方法#1:

为每个 SQL Server 实例创建两个 OLEDB Connection Managers。例如,如果您有两个数据库 SourceDB 和 DestinationDB,您可以创建两个名为 OLEDB_SourceDBOLEDB_DestinationDB 的连接管理器。如果您愿意,也可以使用 ADO.NET 连接管理器。根据我在基于 SSIS 的书籍中阅读的内容,OLEDB 的性能优于 ADO.NET 连接管理器。

控制流选项卡上拖放Data Flow Task

数据流任务中,配置一个OLE DB Source来从源数据库表中读取数据。

使用 Lookup Transformation 使用源表和目标表之间的唯一键检查数据是否已存在于目标表中。

如果源表行does not exist在目标表中,则使用OLE DB Destination将行插入目标表

如果源表行 exists 在目标表中,则使用另一个 OLE DB Destination 将行插入到目标数据库上的临时表中。

控制流选项卡上的数据流任务之后放置一个Execute SQL Task。编写一个查询,使用临时表数据更新目标表中的数据。

查看以下 SO 问题的答案以了解详细步骤。

How do I optimize Upsert (Update and Insert) operation within SSIS package?

方法#2:

为每个 SQL Server 实例创建两个 OLEDB Connection Managers。例如,如果您有两个数据库 SourceDB 和 DestinationDB,您可以创建两个名为 OLEDB_SourceDBOLEDB_DestinationDB 的连接管理器。

控制流选项卡上拖放Data Flow Task

数据流任务中,配置一个OLE DB Source以从源数据库表中读取数据并使用OLE DB Destination插入到临时表中。

控制流标签的Data Flow Task之后放置一个Execute SQL Task。编写一个在临时表和目标表之间使用 MERGE 语句的查询。

【讨论】:

【参考方案2】:

查看此链接 - http://technet.microsoft.com/en-us/library/cc280522%28v=sql.105%29.aspx

基本上,要做到这一点,您需要使用数据流任务将来自不同服务器的数据获取到同一个位置,然后执行执行 SQL 任务来进行合并。

Merge 和 Merge Join SSIS Data Flow 任务看起来不像您想做的那样。

【讨论】:

以上是关于如何跨多个数据库服务器使用 MERGE 语句?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle MERGE语句

oracle中多个进程可以使用merge into语句对同一个表操作不,能锁表吗

跨多个服务器访问不同数据库的表的方法

IF EXISTS 和 MERGE 语句

oracle中merge into的使用

Oracle中merge into的使用