代码之家  ›  专栏  ›  技术社区  ›  Robin Day

跨数据库服务器连接的SQL Server 2005脚本

  •  3
  • Robin Day  · 技术社区  · 14 年前

    我有下面的脚本,我用它在两个不同数据库的表之间给出一个简单的“diff”。(注:实际上,我的比较不仅仅是一个身份证)

    SELECT
        MyTableA.MyId,
        MyTableB.MyId
    FROM
        MyDataBaseA..MyTable MyTableA
    FULL OUTER JOIN
        MyDataBaseB..MyTable MyTableB
    ON
        MyTableA.MyId = MyTableB.MyId
    WHERE
        MyTableA.MyId IS NULL
    OR
        MyTableB.MyId IS NULL
    

    我现在需要在存在于不同服务器上的两个数据库上运行此脚本。目前,我的解决方案是从一台服务器备份数据库,将其还原到另一台服务器,然后运行脚本。

    我很确定这是可能的,但是,这可能是一个蠕虫罐头吗?这是一个非常罕见的任务,我需要执行,如果它涉及大量的数据库设置更改,那么我可能会坚持我的备份方法。

    2 回复  |  直到 13 年前
        1
  •  1
  •   etoisarobot    14 年前

    如果您在sql中设置了链接服务器,您可以像这样运行常规查询。 这假设mydatabaseb位于您设置链接服务器的远程服务器上,并且查询正在具有mydatabasea的服务器上运行。

    SELECT
    MyTableA.MyId,
    MyTableB.MyId
    FROM
    MyDataBaseA..MyTable MyTableA
    FULL OUTER JOIN
    LinkedServerName.MyDataBaseB.dbo.MyTable MyTableB
    ON
    MyTableA.MyId = MyTableB.MyId
    WHERE
    MyTableA.MyId IS NULL
    OR
    MyTableB.MyId IS NULL
    
        2
  •  0
  •   Remus Rusanu    14 年前

    我也会推荐ssis。有两个数据源一个 select ID from MyTableA order by ID 还有一个 select ID from MyTableB order by ID . 排序依据很重要,您需要进入高级编辑器,并在两个源中将输出标记为按id排序。然后将这两个源插入合并联接转换,并指定这是完全联接类型。然后将连接的输出插入到条件拆分转换中,并将a和b id不为空的行与a或b id上为空的行分开。最后这些行将是您的“diff”。

    根据我的经验,随着表大小的增加,ssis解决方案将变得越来越有吸引力,因为为分布式查询生成的计划将变得难以管理的低效。