【问题标题】:Microsoft SQL Server: Query to see list of all databases, and their corresponding tables, and columnsMicrosoft SQL Server:查询以查看所有数据库及其对应表和列的列表
【发布时间】:2017-10-12 05:19:36
【问题描述】:

我的发现似乎一次只显示一个数据库(例如,从 information_schema.columns 中选择 *)。有没有像 select * from sys.databases 这样的东西,它不仅包括所有数据库名称,还包括它们自己的表和列名?

希望查看服务器的所有这些:数据库名称、表名称、列名称。

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

【问题讨论】:

  • 您可以使用未记录的 sp_msforeachdb,但它有时会跳过数据库。您也可以为此利用动态 sql,这可能是我会做的。你想要什么输出?只有数据库名、表名和列名?
  • 这样做的唯一方法是通过动态 sql。你在这里的真正目标是什么?你为什么要这样做?你认为你需要什么?也许你问错了问题,因为我无法想象这到底有什么价值……它太笼统和宽泛了。你能把你的问题集中在你的具体需求上吗?
  • 是的,只需要这三样东西。我正在尝试熟悉一家新公司的服务器,并且只想通过浏览每个数据库中的表名和列来进行探索。此外,我没有写入权限,并且正在 Tableau 自定义 SQL 中执行此操作。

标签: sql sql-server


【解决方案1】:

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

EXEC sp_MSforeachdb N'
BEGIN
    use ?
    select * from information_schema.tables
    select * from information_schema.columns
END';

【讨论】:

    【解决方案2】:

    我以前用过的一个:

    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】:

      我不是无证程序的忠实拥护者。 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
      

      【讨论】:

        【解决方案4】:

        哟,试试这个?

        --数据库名称

        选择名称 FROM sys.databases

        --表名

        选择名称 FROM sys.tables

        --列名

        选择名称 FROM sys.columns

        有帮助吗?

        【讨论】:

        • 对不起,这只是给你的名字。如果您想要更多,也可以使用 *。
        • OP 想要服务器上所有数据库的此信息,而不仅仅是当前数据库。
        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-08
        相关资源
        最近更新 更多