SQL Server Management Studio - 查找所有非空表

时间:2013-07-19 14:19:37

标签: sql-server tsql ssms

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

6 个答案:

答案 0 :(得分:10)

您可以尝试使用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

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

答案 2 :(得分:3)

Morris Miao's solution使用已弃用的sys.sysindexes视图;并根据表名执行到INFORMATION_SCHEMA.TABLES的连接,这不保证是唯一的;即使有数据库。

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;

答案 3 :(得分:1)

还可以使用&#34;对象资源管理器详细信息(F7)&#34;,导航到感兴趣的数据库的&#34;表&#34; -Folder,并设置对象资源管理器详细信息以显示行计数(右键单击标题)

答案 4 :(得分:1)

让我们说桌子可以有两种类型。

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

答案 5 :(得分:1)

这对@jophab's answer有所改进。它将显示表的架构并使用rows = 0比较sys.partitions

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