如何跨多个数据库服务器使用 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_SourceDB
和 OLEDB_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_SourceDB
和 OLEDB_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 语句?的主要内容,如果未能解决你的问题,请参考以下文章