Azure中的SSIS Cross-DB“WHERE IN”子句(或等效)

时间:2016-04-21 19:30:59

标签: sql-server azure ssis

我目前正在尝试在SSIS中构建数据流,以从映射表中选择所有记录,其中相关Item表中存在ID列。有两个并发症:

  1. 这两个表当前位于不同服务器上的不同数据库中。
  2. 数据库位于Azure中,我读过的链接服务器不受支持。
  3. 更清楚一点,将数据从Staging环境迁移到Production。如果关联的项ID在那里,我只想将查找记录推送到prod。这里有一些psudo-TSQL给出了我正在努力实现的目标:

    SELECT *
    FROM [Staging_Server].[SourceDB].[dbo].[Lookup] L
    WHERE L.[ID] IN (
        SELECT P.[Item]
        FROM [Production_Server].[TargetDB].[dbo].[Item] P
    )
    

    我还没有找到一种在SSIS中创建它的好方法。我想我已经创建了一个解决方法,包括对表进行排序和执行合并连接,但是对双方进行排序对性能的影响是不必要的。我正在为这个看似简单的数据流寻找更直接,更直观的设计。

2 个答案:

答案 0 :(得分:2)

在数据流中执行此操作,您将获得源查询,无法过滤,并将其提供给作为子查询的查找组件。

这方面的挑战是SSIS可能是本地的,这意味着您将把所有数据从Stage Azure中提取到运行SSIS的服务器并将其推送回Prod Azure实例。

这是很多网络活动,当我正在阅读Azure定价指南时,我想只要你有合适的DTU,你就可以了。回到当天,你被指控为Reads而不是Writes,因此成语只是将你的所有数据推送到目标服务器,然后在那里进行比较,就像ElendaDBA提到的那样。我对实现的建议只是避免临时表或临时创建/销毁它们。只需实现为物理表,并在传输到生产之前截断并重新加载。

答案 1 :(得分:0)

您可以在临时服务器上创建临时表以将生产数据复制到其中。然后,您可以创建一个连接这两个表的查询。运行SSIS包后,您可以删除临时服务器上的临时表