SQL - 在服务器上的所有数据库的INFORMATION_SCHEMA

时间:2011-04-26 07:21:36

标签: sql sql-server information-schema

INFORMATION_SCHEMA.TABLES或INFORMATION_SCHEMA.COLUMNS仅适用于指定的数据库。

是否可以使用INFORMATION_SCHEMA查询服务器上所有数据库的表元数据?

6 个答案:

答案 0 :(得分:10)

只能通过使用动态查询进行数据库迭代来执行此操作。一种方法是使用 ms_ForEachDB 存储过程,第二种方法是查询 sys.databases 动态视图。

答案 1 :(得分:1)

您可以使用:

SELECT TABLE_SCHEMA
FROM information_schema.tables
group by tables.TABLE_SCHEMA

答案 2 :(得分:1)

将Dalex的答案扩展为代码。

--Make sure you have a global temporary table to use. Double dots are shorthand for .dbo.
IF OBJECT_ID('tempdb..##test') IS NOT NULL DROP TABLE ##test
--Create the table definition the easy way.
SELECT * INTO ##test
FROM ???.INFORMATION_SCHEMA.TABLES --The ??? will be whatever the name of your first database is.
DELETE FROM ##test
--Add all the data.
EXEC sp_MSforeachdb 'USE ? INSERT INTO ##test SELECT * FROM INFORMATION_SCHEMA.TABLES'
--View all the data.
SELECT * FROM ##test
--Clean up.
DROP TABLE ##test

答案 3 :(得分:0)

这不是问题的答案,但此文本增加了上下文...并且该文本可能对某人有所帮助。

可能并且经常需要添加一个use子句,以选择在select子句上方引用的数据库。

例如

use CaseData

SELECT *
FROM information_schema.columns 

--WHERE 

--TABLE_CATALOG = 'CaseData'

--and TABLE_SCHEMA ='Clinical'

--and 

--TABLE_NAME = 'SAASCaseData_NewFieldsOct2018'

答案 4 :(得分:0)

修改了 Dustin's 代码(来自 Dalex 的建议)以容纳带有空格的数据库名称,并从结果中消除常见的系统表。

--Make sure you have a global temporary table to use. Double dots are shorthand for .dbo.
IF OBJECT_ID('tempdb..##test') IS NOT NULL DROP TABLE ##test

--Create the table definition the easy way.
SELECT top 1 * INTO ##test
FROM INFORMATION_SCHEMA.TABLES
DELETE FROM ##test

--Add all the data.
EXEC sp_MSforeachdb 'USE [?] INSERT INTO ##test SELECT * FROM INFORMATION_SCHEMA.TABLES'

--View all the data.
SELECT * FROM ##test
WHERE TABLE_CATALOG NOT IN ('master','tempdb', 'msdb')
ORDER BY TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME

--Clean up.
DROP TABLE ##test

答案 5 :(得分:-1)

SELECT DISTINCT `TABLE_SCHEMA` FROM `information_schema`.`TABLES`;