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

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

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

【问题讨论】:

  • 以上答案是所提问题的正确答案(恕我直言),但应作为答案输入,而不是评论。

标签: sql sql-server ssis


【解决方案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 任务看起来不像您想做的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-22
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      相关资源
      最近更新 更多