Fra*_*lin 5 sql sql-server sql-server-2008
我需要比较来自2个不同数据库的不同表的列,以便根据需求向主表添加列.
例如:
假设在master数据库中我创建了一个表,如:
create table test(id int,name varchar(10))
Run Code Online (Sandbox Code Playgroud)
假设在测试数据库中我创建了一个像
create table testings(id int,name varchar(20), sal int)
Run Code Online (Sandbox Code Playgroud)
现在我要比较2个表列
我不想使用红门工具.
谁能帮我?
您可以使用EXCEPT或INTERSECT设置运算符.像这样:
SELECT id, name FROM master.dbo.test
EXCEPT -- or INTERSECT
SELECT id, name FROM test.dbo.testings
Run Code Online (Sandbox Code Playgroud)
这会给你:
EXCEPT:从左侧查询中返回在右侧查询中也找不到的任何不同值.
INTERSECT:返回INTERSECT操作数左侧和右侧的查询返回的任何不同值.
在您的情况下,由于您要从两个不同的数据库中进行选择,因此必须使用完全限定的表名.他们必须在形式database.schema.object_name.
更新:如果要比较两个表列的名称而不是数据本身,则必须使用元数据表以相同的方式比较列的名称EXCEPT.
例如,假设您有两个数据库:
Test 数据库包含表:
create table test(id int, name varchar(10), dep varchar(50));
Run Code Online (Sandbox Code Playgroud)
和另一个数据库:
anotherdatabase 数据库包含表:
create table testings(id int,name varchar(20), sal int);
Run Code Online (Sandbox Code Playgroud)并且您希望比较两个表的列并获取另一个表中不存在的表,在我们的示例中您需要获取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;
Run Code Online (Sandbox Code Playgroud)
这应该给你:

请注意:我加入了表格:
与表:
仅获取具有相同数据类型的列.如果您没有加入此表,那么如果两列具有相同的名称但数据类型不同,则它们将是相同的.