选择SQL Server中的所有空表

如何获取我的
sql-server
数据库中没有任何记录的表列表?     
已邀请:
在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只捕获具有总行数的行(表)等于零。     
要获取空表的列表,我们可以使用下面的tsql -
EXEC sp_MSforeachtable 'IF NOT EXISTS (SELECT 1 FROM ?) PRINT ''?'' '
并且,要获取至少有一行数据的表列表,我们可以使用下面的tsql -
EXEC sp_MSforeachtable 'IF EXISTS (SELECT 1 FROM ?) PRINT ''?'' '
注意:表格列表仅包括“用户表”,即不包括“系统表”。     
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 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
    
我们可以简单地将表分类为两种类型。 聚类表(具有聚簇索引的表) 堆表(     没有聚集索引的表) 在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.
一个表可以有一个聚簇索引,也可以没有。 但是表可以有多个非聚簇索引。 因此,在对行进行求和时,我们不能使用clus13ѭs的非聚簇索引。 堆表将具有
index_id = 0
集群表将具有
index_id = 1
    

要回复问题请先登录注册