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

时间:2012-11-22 10:46:27

标签: sql sql-server sql-server-2008

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

例如:

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

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

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

这样的表
create table testings(id int,name varchar(20), sal int)

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

我不想使用红门工具。

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:11)

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

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

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

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

答案 1 :(得分: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 的形式。

更新:如果要比较两个表列的名称而不是数据本身,则必须使用元数据表来比较列的名称与{{1}的方式相同}。

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

  • EXCEPT 数据库包含表格:

    Test

    和另一个数据库:

  • create table test(id int, name varchar(10), dep varchar(50)); 数据库包含表格:

    anotherdatabase

并且您希望比较两个表的列并获取另一个表中不存在的表,在我们的示例中,您需要获取create table testings(id int,name varchar(20), sal int); sal

然后你可以这样做:

dep

这应该给你:

enter image description here

请注意:我加入了表:

表:

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

答案 2 :(得分: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'

答案 3 :(得分:0)

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

通过将数据类型差异简化为通用格式,可以智能地原谅(数字,字符串和日期)数据类型差异。输出是带有.xls扩展名的稀疏制表符分隔文件,用于电子表格。