【问题标题】:Select all empty tables in SQL Server选择 SQL Server 中的所有空表
【发布时间】:2021-06-18 14:04:56
【问题描述】:

如何获取我的sql-server 数据库中没有任何记录的表的列表?

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

在 SQL Server 2005 及更高版本上,您可以使用如下内容:

;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

CTE(公用表表达式)中的内部选择计算每个表的行数并按表(OBJECT_ID)对它们进行分组,然后来自 CTE 的外部 SELECT 仅抓取那些具有总行数为零。

更新:如果你想检查非微软/系统表,你需要像这样扩展查询(加入sys.tables目录视图):

;WITH TableRows AS
(
   SELECT 
       SUM(ps.row_count) AS [RowCount], 
       t.Name AS TableName
   FROM 
       sys.dm_db_partition_stats ps
   INNER JOIN
       sys.tables t ON t.object_id = ps.object_id
   WHERE 
       (ps.index_id = 0 OR ps.index_id = 1)
       AND t.is_ms_shipped = 0
   GROUP BY 
       t.Name
)
SELECT *
FROM TableRows
WHERE [RowCount] = 0

【讨论】:

  • 我发现的唯一一个也适用于 SQL Azure 的。谢谢!
  • 当我对 SQL Azure 运行这个查询时,它得到了很多系统表。我不想过滤用户表的结果。也许可以调整查询以删除系统表?
  • @mortb:发布了一个更新/改编的版本,从结果中排除了所有 Microsoft 提供的(系统)表
【解决方案2】:

要获取空表的列表,我们可以使用下面的tsql——

EXEC sp_MSforeachtable 'IF NOT EXISTS (SELECT 1 FROM ?) PRINT ''?'' '

而且,要获得至少有一行数据的表列表,我们可以使用下面的 tsql –

EXEC sp_MSforeachtable 'IF EXISTS (SELECT 1 FROM ?) PRINT ''?'' '

注意:表列表仅包括“用户表”,即不包括“系统表”。

【讨论】:

    【解决方案3】:
    select a.rows as Rowcnt,
       b.name as Tbl_Name 
    from sys.partitions a
    join sys.tables b
       on a.object_id=b.object_id
    where b.type='u' 
       and a.rows = 0
    

    【讨论】:

    • select distinct b.name as tableName, a.rows as rowsCount from sys.partitions a join sys.tables b on a.object_id=b.object_id where b.type='u' and a. rows =0 按 a.rows 排序
    • 或者,对结果进行分组和求和
    【解决方案4】:
      SELECT name AS [TableList] FROM SYS.DM_DB_PARTITION_STATS s 
      INNER JOIN sys.tables t ON t.[object_id] = s.[object_id]
      WHERE row_count = 0
    

    【讨论】:

      【解决方案5】:

      我们可以简单地将表格分为两种类型。

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

      在 SQL Server 中,所有表都划分为partitions。每个表至少有一个分区。

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

      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_ids。

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

      【讨论】:

        【解决方案6】:
        1. 我们可以使用以下代码找到所有空表。
        select schema_name(tab.schema_id) + '.' + tab.name as [TableList] 
        from sys.tables tab 
        inner join sys.partitions part 
        on tab.object_id = part.object_id 
        where part.index_id IN (1, 0) 
        group by schema_name(tab.schema_id) + '.' + tab.name 
        having sum(part.rows) = 0 
        order by [TableList]
        

        【讨论】:

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