首页 > 解决方案 > 如何在 Server SQL 中正确列出此特定结构的所有表

问题描述

我有这个结构:

-Server
   -Databases
       -System Databases <- I do not want this
          - master
          - model
          - msdv
          - tempdb
       -Database Snapshots <- Neither this
       -DB1 (a database) <- I want the info in here
          - Databases Diagrams
          - Tables <- Name of tables, size and rows
          - Views
          - etc...
       -DB2              <- and here
       -etc..            <- and All of that     

我想列出所有这些 DB1、DB2... 中的所有表,以收集诸如 table_name、行数、大小等信息。

我最初尝试过这个:

SELECT
    d.name
    ,d.create_date
FROM
    sys.databases d
WHERE 
    d.name NOT IN ('master', 'tempdb', 'model', 'msdb') 

现在列出了我的数据库(DB1,DB2 ...)...

例如,如果我想要单个数据库的表,我会这样做:

SELECT
    *
FROM
    DB1.INFORMATION_SCHEMA.tables

它会列出它们,但是对于每个数据库,我如何获得以下信息?

我目前遇到的问题是我的查询仅在系统数据库上获取,我不知道如何执行上述操作

标签: sqlsql-serverdatabase

解决方案


DECLARE @Tables TABLE ( 
  DatabaseName sysname, 
  SchemaName sysname, 
  TableName sysname 
);

INSERT INTO @Tables (DatabaseName, SchemaName, TableName) 
EXEC sp_msforeachdb 'select ''?'', s.name, t.name from [?].sys.tables t inner join [?].sys.schemas s on t.schema_id = s.schema_id';


SELECT 
    *
FROM
    @Tables t
WHERE 
    t.DatabaseName NOT IN ('master', 'tempdb', 'model', 'msdb')

这得到了我想要的结果,即:

DB1 - dbo - tableName1
DB1 - dbo - tableName2
...
DB2 - dbo - tableName1

等等服务器中的每个表

谢谢大家的时间


推荐阅读