我需要比较来自2个不同数据库的不同表的列,以便根据需求将列添加到主表中。
例如:
假设在master数据库中我创建了一个表,如:
create table test(id int,name varchar(10))
假设在测试数据库中我创建了一个像
这样的表create table testings(id int,name varchar(20), sal int)
现在我必须比较2个表格列
我不想使用红门工具。
任何人都可以帮助我吗?
答案 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
这应该给你:
请注意:我加入了表:
表:
仅获取具有相同数据类型的列。如果您没有加入此表,那么如果两列具有相同的名称但数据类型不同,则它们将是相同的。
答案 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扩展名的稀疏制表符分隔文件,用于电子表格。