2012-11-22 193 views
5

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

例如:

假设在主数据库我已创建了一个表所示:

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

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

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

现在我要比较2表列

我不想使用红门工具。

任何人都可以帮助我吗?

回答

8

您可以使用EXCEPT or INTERSECT集合运算符。像这样:

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; 

这应该给你:

enter image description here

需要注意的是:我加入的表:

与表:

只得到具有相同的数据类型的列。如果您没有加入此表,那么如果两列具有相同的名称但数据类型不同,则它们将是相同的。

+0

您好Mahmoud Gamel,感谢您给予回复,请记住,总是设置操作员在行明智而不是明智的。我的要求是我必须比较2个表列如果任何表的列数少于另一个我必须确定列名称,我必须添加它。我希望你站在下面。 – Franklin

+0

@ user1694000 - 抱歉误会。所以,你想获得列名不在任何这些。对?只是列名。 –

+0

@ user1694000 - 查看我的编辑。 –

1

要比较列在SQL SERVER中使用INFORMATION_SCHEMA.COLUMNS表。

这是〔实施例:

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' 
11

难道你不希望只使用红色门工具或基本上任何第三方工具?为什么不,即使你没有预算购买,你仍然可以在试用模式下使用它来完成工作?

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

有了这么多的工具,你可以大概在试用模式下运行数月都一个接一个......

知道系统表和如何做到这一点本身是伟大的,但它仅消耗太多时间......

相关问题