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

时间:2013-02-25 12:27:48

标签: sql sql-server ssis

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

有人可以解释我如何引用我的 Execute SQL Task 中不同服务器上存在的两个不同的数据库吗?

2 个答案:

答案 0 :(得分:2)

可能的方法:

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

方法#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 ,使用源表和目标表之间的uniquer密钥检查目标表中是否已存在数据。

  • 如果目标表中的源表格行 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

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

答案 1 :(得分:0)

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

基本上,为此,您需要使用数据流任务将来自不同服务器的数据放入同一位置,然后执行执行SQL任务以进行合并。

合并和合并加入SSIS数据流任务看起来不像他们想做的那样。