【问题标题】:SQL Server Management Studio - Finding all non empty tablesSQL Server Management Studio - 查找所有非空表
【发布时间】:2013-07-18 21:02:15
【问题描述】:

SQL Server Management Studio Express 有没有办法列出所有非空表?我有 100 多个表要检查数据。

【问题讨论】:

  • 在单个数据库或多个数据库中?

标签: sql-server tsql ssms


【解决方案1】:

您可以尝试使用sysindexesINFORMATION_SCHEMA.TABLES:)

SELECT 'Table Name'=convert(char(25),t.TABLE_NAME),
      'Total Record Count'=max(i.rows)
FROM sysindexes i, INFORMATION_SCHEMA.TABLES t
WHERE t.TABLE_NAME = object_name(i.id)
      and t.TABLE_TYPE = 'BASE TABLE'
GROUP BY t.TABLE_SCHEMA, t.TABLE_NAME
HAVING max(i.rows)>0
ORDER BY 'Total Record Count' DESC

【讨论】:

  • 我结束了使用 thos 代码,因为我不知道自己在做什么......我刚刚添加了 databasename.INFORM...
  • 我喜欢你如何包含少于 0 行的表格;)
  • @JoshNoe,我修好了。不敢相信它会保持这种状态这么久。
【解决方案2】:

Morris Miao's solution 使用已弃用的sys.sysindexes 视图;并根据表名对INFORMATION_SCHEMA.TABLES进行join,不保证唯一;甚至在数据库中。

Simon's solution 不在当前数据库范围内;但可以通过使用sys.tables进行细化:

SELECT r.table_name, r.row_count, r.[object_id]
FROM sys.tables t
INNER JOIN (
    SELECT OBJECT_NAME(s.[object_id]) table_name, SUM(s.row_count) row_count, s.[object_id]
    FROM sys.dm_db_partition_stats s
    WHERE s.index_id in (0,1)
    GROUP BY s.[object_id]
) r on t.[object_id] = r.[object_id]
WHERE r.row_count > 0
ORDER BY r.table_name;

【讨论】:

  • 除非用户是服务器管理员用户,否则此方法不起作用。这将产生“数据库 '' 中的 VIEW DATABASE STATE 权限被拒绝。
【解决方案3】:

试试看:

WITH TableRows AS
(
   SELECT 
      SUM(row_count) AS [RowCount], 
      OBJECT_NAME(OBJECT_ID) AS TableName
   FROM 
      sys.dm_db_partition_stats
   WHERE 
      index_id = 0 OR index_id = 1
   GROUP BY 
      OBJECT_ID
)

SELECT *
FROM TableRows
WHERE [RowCount] > 0

【讨论】:

  • 如何在一个数据库中获取非空表?
  • @PeterSun:见my answer
【解决方案4】:

假设表格可以有两种类型。

  1. 聚集表(具有聚集索引的表)
  2. 堆表 ( 没有聚集索引的表)

SQL Server 中的所有表都划分为分区。这样所有表都至少有一个分区。

sys.partitions 中,所有表的每个分区都存在一行。

sys.partitions 中的这些行包含有关相应表的该分区中行数的信息。

由于 SQL Server 中的所有表都至少包含一个分区,因此我们可以从sys.partitions 获取有关表中行数的信息。

SELECT
        OBJECT_NAME(T.OBJECT_ID) AS TABLE_NAME,
        SUM(P.ROWS)  AS TOTAL_ROWS
FROM
        SYS.TABLES T
INNER JOIN 
        SYS.PARTITIONS P 
        ON T.OBJECT_ID = P.OBJECT_ID
WHERE 
        P.INDEX_ID IN (0,1)
GROUP BY 
        T.OBJECT_ID
HAVING 
        SUM(P.ROWS) > 0

在对不同分区中的行求和时,我们正在考虑index_id (0,1)

  • index_id = 0 for Heap
  • index_id = 1 for Clustered index
  • index_id > 1 are for nonclustered index.

一张表可以有一个聚集索引,也可以没有。

但非聚集索引并非如此。一个表可以有多个非聚集索引。 所以我们不能在对行求和时使用那些index_id

  • 堆表将具有index_id = 0
  • 聚集表将具有index_id = 1

【讨论】:

  • 这是唯一无需用户成为服务器管理员(或明确授予数据库的 VIEW DATABASE STATE 权限)即可运行的查询。
【解决方案5】:

也可以使用“对象资源管理器详细信息 (F7)”,导航到感兴趣的数据库的“表”文件夹并设置对象资源管理器详细信息以显示行数(右键单击标题)

【讨论】:

    【解决方案6】:

    这是对@jophab's answer 的轻微改进。它将显示表的架构以及使用sys.partitions 比较rows = 0

    SELECT 
        sch.name as SchemaName,
        t.NAME AS TableName,
        p.rows AS RowCounts
    FROM 
        sys.tables t
    INNER JOIN 
        sys.partitions p ON t.object_id = p.OBJECT_ID 
    INNER JOIN sys.schemas sch
        on t.schema_id = sch.schema_id
    WHERE 
        t.NAME NOT LIKE 'dt%' 
        AND t.is_ms_shipped = 0
        AND p.rows = 0
    GROUP BY 
        sch.name,t.Name, p.Rows
    ORDER BY 
        sch.name,t.Name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多