5

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

例如:

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

create table test(id int,name varchar(10))

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

create table testings(id int,name varchar(20), sal int)

现在我必须比较 2 个表格列

我不想使用红门工具。

谁能帮我?

4

4 回答 4

11

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

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

有这么多可用的工具,您可能可以在试用模式下一个一个地运行几个月……

了解系统表以及如何以本机方式执行此操作很棒,但它太耗时了......

于 2013-08-22T10:32:51.200 回答
8

为此,您可以使用EXCEPTorINTERSECT运算符。像这样:

SELECT id, name FROM master.dbo.test
EXCEPT  -- or INTERSECT
SELECT id, name FROM test.dbo.testings

这会给你:

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

  • INTERSECT:返回由 INTERSECT 操作数左右两侧的查询返回的任何不同值。

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

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

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

  • Test数据库包含表:

    create table test(id int, name varchar(10), dep varchar(50));
    

    和另一个数据库:

  • anotherdatabase数据库包含表:

    create table testings(id int,name varchar(20), sal int);
    

并且您想比较两个表的列并获取另一个表中不存在的表,在我们的示例中您需要获取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;

这应该给你:

在此处输入图像描述

请注意:我加入了表格:

与表:

仅获取具有相同数据类型的那些列。如果你没有加入这个表,那么如果两列具有相同的名称但不同的数据类型,它们将是相同的。

于 2012-11-22T10:49:29.277 回答
1

要比较列,请使用INFORMATION_SCHEMA.COLUMNSSQL SERVER 中的表。

这是示例:

select column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='your_table_name1'
except
select column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='your_table_name2'
于 2013-04-04T11:46:52.890 回答
0

这是我编写的一个 GPL Java 程序,用于使用 JDBC 跨任何两个异构数据库比较任何两个表中的数据,具有公共键和公共列:https ://sourceforge.net/projects/metaqa/

它通过将(数字、字符串和日期)数据类型差异简化为通用格式来智能地排除它们。输出是一个稀疏的制表符分隔文件,扩展名为 .xls,用于电子表格。

于 2020-03-05T11:25:47.000 回答