【问题标题】:SSIS to copy data from one table to another, where not in destination tableSSIS将数据从一个表复制到另一个表,而不是在目标表中
【发布时间】:2012-04-10 21:16:49
【问题描述】:

我正在服务器 (server1) 上创建一个 SSIS 包,它查看另一个站点 (server2) 上的 sql db 中的数据并复制相关行。

所需的SQL语句是:

SELECT *
FROM server2.ordersTable
WHERE
OrderID Not In (SELECT OrderID FROM server1.ordersTable

这会从 server1 中选择不在 server2 表中的数据(基于订单 ID) 然后我需要将结果插入到 server1 上的表中

我将如何处理这个问题?我需要什么组件等等...?

【问题讨论】:

    标签: sql-server-2008 ssis


    【解决方案1】:

    假设您可以使用 OPENQUERY 或 server2 上的直接链接服务器连接到 server1(如您的示例或@schrodinger 代码中的答案),这将是最小化网络数据的最佳解决方案。

    但如果这不可用,您还有另外两个选择:

    1) 您可以使用 SSIS 中的 Lookup 数据流转换来检查现有 OrderID 的记录,并仅使用条件拆分转换推送新记录。

    2) 您可以将整个表从 Server2 转移到 Server1 上的临时表中,然后使用您发布的代码的变体在 Server1 上进行比较。

    【讨论】:

      【解决方案2】:

      意识到这是一个旧线程......

      如果您想在 SSIS 中执行此操作,我建议使用以下数据流:

      • 两个数据源。
      • 源 A 选择您要移动的所有数据
      • 源 B 从目标中选择密钥
      • 将两个源都运行到配置为左连接的合并连接中
      • 将连接结果运行到条件拆分中,定义一个输出,其中源 B 的键为空
      • 将拆分的相应输出运行到在相应表中插入所需行的目标。

      可以进行许多增强以支持其他功能,例如处理更新和删除。还有一些性能调整技巧可以根据数据量的需要应用,其中最简单的方法之一是检查源数据的修改日期与包上次运行的时间,以减少源 A 选择的记录数。

      【讨论】:

        【解决方案3】:

        您可以为其中一个服务器创建一个链接服务器,首先为 server1 说 LinkedServer1,然后您可以使用 OPENQUERY,例如:

        选择 * FROM server2.OrdersTable 在哪里 订单 ID 不在 ( 选择订单编号 FROM OPENQUERY(LinkedServer, '从 LinkedServer1.OrdersTable 中选择 OrderID) )

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-24
          • 2011-05-16
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多