INFORMATION_SCHEMA.TABLES
或INFORMATION_SCHEMA.COLUMNS
仅适用于指定的数据库。
是否可以使用查询服务器上所有数据库的表元数据INFORMATION_SCHEMA
?
INFORMATION_SCHEMA.TABLES
或INFORMATION_SCHEMA.COLUMNS
仅适用于指定的数据库。
是否可以使用查询服务器上所有数据库的表元数据INFORMATION_SCHEMA
?
您只能通过对数据库迭代使用动态查询来做到这一点。一种方法是使用ms_ForEachDB存储过程,第二种是查询sys.databases动态视图。
将 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
修改了Dustin 的代码(来自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
你可以使用这个:
SELECT TABLE_SCHEMA
FROM information_schema.tables
group by tables.TABLE_SCHEMA
这不是问题的答案,但此文本添加了上下文......并且文本可能对某人获得理解有用。
可以并且经常需要添加一个 use 子句来选择在 select 子句上方引用哪个数据库。
例如
use CaseData
SELECT *
FROM information_schema.columns
--WHERE
--TABLE_CATALOG = 'CaseData'
--and TABLE_SCHEMA ='Clinical'
--and
--TABLE_NAME = 'SAASCaseData_NewFieldsOct2018'
SELECT DISTINCT `TABLE_SCHEMA` FROM `information_schema`.`TABLES`;