比较来自2个不同数据库的2个不同表列

Fra*_*lin 5 sql sql-server sql-server-2008

我需要比较来自2个不同数据库的不同表的列,以便根据需求向主表添加列.

例如:

假设在master数据库中我创建了一个表,如:

create table test(id int,name varchar(10))
Run Code Online (Sandbox Code Playgroud)

假设在测试数据库中我创建了一个像

create table testings(id int,name varchar(20), sal int)
Run Code Online (Sandbox Code Playgroud)

现在我要比较2个表列

我不想使用红门工具.

谁能帮我?

小智 11

它只是您不想使用的红门工具或基本上任何第三方工具吗?为什么不,即使您没有预算购买,您仍然可以在试用模式下使用它来完成工作?

我们一直在使用Apex Diff工具,但还有更多.

有了这么多工具,你可以在试用模式下逐个运行几个月......

了解系统表以及如何在本地执行此操作非常棒,但这太耗时了......


Mah*_*mal 8

您可以使用EXCEPTINTERSECT设置运算符.像这样:

SELECT id, name FROM master.dbo.test
EXCEPT  -- or INTERSECT
SELECT id, name FROM test.dbo.testings
Run Code Online (Sandbox Code Playgroud)

这会给你:

  • EXCEPT:从左侧查询中返回在右侧查询中也找不到的任何不同值.

  • INTERSECT:返回INTERSECT操作数左侧和右侧的查询返回的任何不同值.

在您的情况下,由于您要从两个不同的数据库中进行选择,因此必须使用完全限定的表名.他们必须在形式database.schema.object_name.

更新:如果要比较两个表列的名称而不是数据本身,则必须使用元数据表以相同的方式比较列的名称EXCEPT.

例如,假设您有两个数据库:

并且您希望比较两个表的列并获取另一个表中不存在的表,在我们的示例中您需要获取saldep.

然后你可以这样做:

SELECT ColumnName
FROM
(
    SELECT  c.name "ColumnName"
    FROM test.sys.tables t
    INNER JOIN test.sys.all_columns c 
            ON t.object_id = c.object_id
    INNER JOIN test.sys.types ty 
            ON c.system_type_id = ty.system_type_id
    WHERE t.name = 'test'
    EXCEPT
    SELECT  c.name
    FROM anotherdatabase.sys.tables t
    INNER JOIN anotherdatabase.sys.all_columns c 
            ON t.object_id = c.object_id
    INNER JOIN anotherdatabase.sys.types ty 
            ON c.system_type_id = ty.system_type_id
    WHERE t.name = 'testings'
) t1
UNION ALL
SELECT ColumnName
FROM
(
    SELECT  c.name ColumnName
    FROM anotherdatabase.sys.tables t
    INNER JOIN anotherdatabase.sys.all_columns c  
            ON t.object_id = c.object_id
    INNER JOIN anotherdatabase.sys.types ty      
            ON c.system_type_id = ty.system_type_id
    WHERE t.name = 'testings'
    EXCEPT
    SELECT  c.name
    FROM test.sys.tables t
    INNER JOIN test.sys.all_columns c 
            ON t.object_id = c.object_id
    INNER JOIN test.sys.types ty 
            ON c.system_type_id = ty.system_type_id
    WHERE t.name = 'test'
) t2;
Run Code Online (Sandbox Code Playgroud)

这应该给你:

在此输入图像描述

请注意:我加入了表格:

与表:

仅获取具有相同数据类型的列.如果您没有加入此表,那么如果两列具有相同的名称但数据类型不同,则它们将是相同的.