如何获取两个不同数据库中所有表的列表

15

我正在尝试创建一个小的SQL脚本(在SQL Server Management Studio中),以获取两个不同数据库中所有表的列表。目标是找出哪些表存在于两个数据库中,哪些仅存在于其中一个。

我已经在SO上找到了各种列出一个数据库所有表的脚本,但迄今我还不能获得多个数据库表的列表。

那么:是否可以查询SQL Server以获取特定数据库中的所有表,例如SELECT * FROM ... WHERE databaseName ='first_db',以便将其与另一个数据库的结果进行连接?

3个回答

23
SELECT * FROM <i>database1</i>.INFORMATION_SCHEMA.TABLES
UNION ALL
SELECT * FROM <i>database2</i>.INFORMATION_SCHEMA.TABLES

更新

为了比较这两个列表,您可以使用FULL OUTER JOIN,它将显示存在于两个数据库中的表以及仅存在于其中一个数据库中的表:

SELECT *
FROM <i>database1</i>.INFORMATION_SCHEMA.TABLES db1
  FULL JOIN <i>database2</i>.INFORMATION_SCHEMA.TABLES db2
    ON db1.TABLE_NAME = db2.TABLE_NAME
ORDER BY COALESCE(db1.TABLE_NAME, db2.TABLE_NAME)

你还可以添加 WHERE db1.TABLE_NAME IS NULL OR db2.TABLE_NAME IS NULL 来仅查看数据库之间的差异。


+1 酷,我本以为这不起作用!甚至可以使用SQL Server特定的db1.sys.tables - Andomar

3
据我所知,您只能查询活动数据库中的表。但是您可以将它们存储在临时表中,然后连接结果。
use db1
insert #TableList select (...) from sys.tables
use db2
insert #TableList2 select (...) from sys.tables
select * from #TableList tl1 join Tablelist2 tl2 on ...

1

仅为完整起见,这是我最终使用的查询(基于Andriy M的答案):

SELECT * FROM DB1.INFORMATION_SCHEMA.Tables db1
  LEFT OUTER JOIN DB2.INFORMATION_SCHEMA.Tables db2
    ON db1.TABLE_NAME = db2.TABLE_NAME
  ORDER BY db1.TABLE_NAME

查找存在于db2中但不存在于db1中的表格,将LEFT OUTER JOIN替换为RIGHT OUTER JOIN


是的,为了找到两者,您可以使用FULL OUTER JOIN - Andriy M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接