9

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

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

4

6 回答 6

13

您只能通过对数据库迭代使用动态查询来做到这一点。一种方法是使用ms_ForEachDB存储过程,第二种是查询sys.databases动态视图。

于 2011-04-26T07:39:00.583 回答
4

将 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
于 2020-01-27T18:02:45.900 回答
1

修改了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
于 2021-06-09T18:53:29.777 回答
0

你可以使用这个:

SELECT TABLE_SCHEMA
FROM information_schema.tables
group by tables.TABLE_SCHEMA
于 2016-04-28T14:30:51.160 回答
0

这不是问题的答案,但此文本添加了上下文......并且文本可能对某人获得理解有用。

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

例如

use CaseData

SELECT *
FROM information_schema.columns 

--WHERE 

--TABLE_CATALOG = 'CaseData'

--and TABLE_SCHEMA ='Clinical'

--and 

--TABLE_NAME = 'SAASCaseData_NewFieldsOct2018'
于 2019-01-22T00:20:44.740 回答
-3
SELECT DISTINCT `TABLE_SCHEMA` FROM `information_schema`.`TABLES`;
于 2016-09-26T04:00:04.240 回答