我需要比较来自 2 个不同数据库的不同表的列,以便根据要求将列添加到主表中。
例如:
假设在主数据库中我创建了一个表,例如:
create table test(id int,name varchar(10))
假设在测试数据库中我创建了一个表
create table testings(id int,name varchar(20), sal int)
现在我必须比较 2 个表格列
我不想使用红门工具。
谁能帮我?
我需要比较来自 2 个不同数据库的不同表的列,以便根据要求将列添加到主表中。
例如:
假设在主数据库中我创建了一个表,例如:
create table test(id int,name varchar(10))
假设在测试数据库中我创建了一个表
create table testings(id int,name varchar(20), sal int)
现在我必须比较 2 个表格列
我不想使用红门工具。
谁能帮我?
它只是您不想使用的红门工具还是基本上任何第三方工具?为什么不呢,即使您没有购买预算,您仍然可以在试用模式下使用它来完成工作?
我们一直在使用Apex Diff工具,但还有更多。
有这么多可用的工具,您可能可以在试用模式下一个一个地运行几个月……
了解系统表以及如何以本机方式执行此操作很棒,但它太耗时了......
为此,您可以使用EXCEPT
orINTERSECT
运算符。像这样:
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);
并且您想比较两个表的列并获取另一个表中不存在的表,在我们的示例中您需要获取sal
和dep
。
然后你可以这样做:
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;
这应该给你:
请注意:我加入了表格:
与表:
仅获取具有相同数据类型的那些列。如果你没有加入这个表,那么如果两列具有相同的名称但不同的数据类型,它们将是相同的。
要比较列,请使用INFORMATION_SCHEMA.COLUMNS
SQL 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'
这是我编写的一个 GPL Java 程序,用于使用 JDBC 跨任何两个异构数据库比较任何两个表中的数据,具有公共键和公共列:https ://sourceforge.net/projects/metaqa/
它通过将(数字、字符串和日期)数据类型差异简化为通用格式来智能地排除它们。输出是一个稀疏的制表符分隔文件,扩展名为 .xls,用于电子表格。