Microsoft SQL Server:查询以查看所有数据库的列表及其对应的表和列

时间:2017-05-12 19:39:52

标签: sql sql-server

我发现的似乎一次只显示一个数据库(例如,select * from information_schema.columns)。是否存在类似于sys.databases中的select *的内容,它不仅包括所有数据库名称,还包括它们自己的表名和列名?

希望查看服务器的所有内容:数据库名称,表名称,列名称。

我正在尝试熟悉新公司的服务器,并希望通过浏览每个数据库中的表名和列来进行探索。此外,我没有写入权限,并且我在Tableau自定义SQL中执行此操作。

4 个答案:

答案 0 :(得分:0)

你看起来像这样吗?你可以试试msforeachdb

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

那有帮助吗?