我发现的似乎一次只显示一个数据库(例如,select * from information_schema.columns)。是否存在类似于sys.databases中的select *的内容,它不仅包括所有数据库名称,还包括它们自己的表名和列名?
希望查看服务器的所有内容:数据库名称,表名称,列名称。
我正在尝试熟悉新公司的服务器,并希望通过浏览每个数据库中的表名和列来进行探索。此外,我没有写入权限,并且我在Tableau自定义SQL中执行此操作。
答案 0 :(得分:0)
EXEC sp_MSforeachdb N'
BEGIN
use ?
select * from information_schema.tables
select * from information_schema.columns
END';
答案 1 :(得分:0)
我不是无证程序的忠实粉丝。并且sp_msforeachdb有时会跳过数据库,似乎没有人真正知道原因。 Aaron Bertrand在这里写了替代品:
我也真的不关心游标,这就是无证程序。如果你看一下代码,它就是一个很难看的光标。对于你想要的简单的东西,我更喜欢使用一些动态的sql和sys表来创建它。
以下是我将如何完成这项任务。它实际上没有比无证程序更多的代码。最大的优点是调试更简单,没有光标。 :)
declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'select ''' + d.name + ''' as DatabaseName
, t.name collate SQL_Latin1_General_CP1_CI_AS as TableName
, c.name collate SQL_Latin1_General_CP1_CI_AS as ColumnName
from ' + quotename(d.name) + '.sys.tables t
join ' + quotename(d.name) + '.sys.columns c on c.object_id = t.object_id UNION ALL '
from sys.databases d
set @SQL = LEFT(@SQL, len(@SQL) - 10) + ' order by DatabaseName, TableName, ColumnName'
select @SQL --once you are satisfied the sql is correct just uncomment the line below
--exec sp_executesql @SQL
答案 2 :(得分:0)
我之前使用的一个:
EXEC master.sys.sp_MSForEachDB N'
IF ''?'' NOT IN (''master'', ''model'', ''msdb'', ''tempdb'')
BEGIN
USE ?
SELECT ''?'' AS theDatabase
, OBJECT_SCHEMA_NAME([tables].[object_id],DB_ID()) AS theSchema
, [tables].name AS theTable
, [columns].[name] AS theColumn
, [types].[name] AS theDatatype
, [columns].max_length AS columnSize
, [columns].[precision] AS columnPrecision
, [columns].scale AS columnScale
, [columns].is_nullable AS isNullable
FROM sys.tables AS [tables]
INNER JOIN sys.all_columns [columns] ON [tables].[object_id] = [columns].[object_id]
INNER JOIN sys.types [types] ON [columns].system_type_id = [types].system_type_id
AND [columns].user_type_id = [types].user_type_id
WHERE [tables].is_ms_shipped = 0
ORDER BY [tables].name, [columns].column_id
END
'
我通常将其转储到临时表中,以便我可以更好地操作结果数据。
我还没有遇到sp_MSforEachDB丢失表的问题,但我会查看Aaron关于这个问题的文章。他绝对是我信任的名字。 : - )
答案 3 :(得分:-2)
- 数据库名称
SELECT名称 来自sys.databases
- 表名
SELECT名称 来自sys.tables
- 列名
SELECT名称 FROM sys.columns
那有帮助吗?