选择SQL Server中的所有空表

时间:2011-04-12 05:15:13

标签: sql-server tsql

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

6 个答案:

答案 0 :(得分:38)

在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只捕获那些行(表)总行数等于零。

答案 1 :(得分:25)

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

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

并且,为了获得至少有一行数据的表列表,我们可以使用下面的tsql -

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

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

答案 2 :(得分:6)

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

答案 3 :(得分: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

答案 4 :(得分:0)

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

  1. 聚类表(具有聚集指数的表)
  2. 堆表(     没有聚集索引的表格)
  3. 在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_id个非聚簇索引。

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

答案 5 :(得分:0)

  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]