INFORMATION_SCHEMA.TABLES或INFORMATION_SCHEMA.COLUMNS仅适用于指定的数据库。
是否可以使用INFORMATION_SCHEMA查询服务器上所有数据库的表元数据?
答案 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`;