我需要比较来自2个不同数据库的不同表的列,以便根据需求向主表添加列。比较来自2个不同数据库的2个不同数据表列
例如:
假设在主数据库我已创建了一个表所示:
create table test(id int,name varchar(10))
假设在测试数据库我已创建了一个表等
create table testings(id int,name varchar(20), sal int)
现在我要比较2表列
我不想使用红门工具。
任何人都可以帮助我吗?
我需要比较来自2个不同数据库的不同表的列,以便根据需求向主表添加列。比较来自2个不同数据库的2个不同数据表列
例如:
假设在主数据库我已创建了一个表所示:
create table test(id int,name varchar(10))
假设在测试数据库我已创建了一个表等
create table testings(id int,name varchar(20), sal int)
现在我要比较2表列
我不想使用红门工具。
任何人都可以帮助我吗?
您可以使用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);
而且要比较两个表列,并获得不中的其他表中存在的表,在我们的例子中,你需要得到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;
这应该给你:
需要注意的是:我加入的表:
与表:
只得到具有相同的数据类型的列。如果您没有加入此表,那么如果两列具有相同的名称但数据类型不同,则它们将是相同的。
要比较列在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'
难道你不希望只使用红色门工具或基本上任何第三方工具?为什么不,即使你没有预算购买,你仍然可以在试用模式下使用它来完成工作?
我们一直在使用Apex Diff工具,但还有更多。
有了这么多的工具,你可以大概在试用模式下运行数月都一个接一个......
知道系统表和如何做到这一点本身是伟大的,但它仅消耗太多时间......
您好Mahmoud Gamel,感谢您给予回复,请记住,总是设置操作员在行明智而不是明智的。我的要求是我必须比较2个表列如果任何表的列数少于另一个我必须确定列名称,我必须添加它。我希望你站在下面。 – Franklin
@ user1694000 - 抱歉误会。所以,你想获得列名不在任何这些。对?只是列名。 –
@ user1694000 - 查看我的编辑。 –