查询以列出数据库中每个表中的记录数

kri*_*tof 184 database sql-server

如何列出数据库中每个表的行数.一些相当于

select count(*) from table1
select count(*) from table2
...
select count(*) from tableN
Run Code Online (Sandbox Code Playgroud)

我将发布一个解决方案,但欢迎其他方法

mar*_*c_s 291

如果您正在使用SQL Server 2005及更高版本,您还可以使用:

SELECT 
    t.NAME AS TableName,
    i.name as indexName,
    p.[Rows],
    sum(a.total_pages) as TotalPages, 
    sum(a.used_pages) as UsedPages, 
    sum(a.data_pages) as DataPages,
    (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB, 
    (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB, 
    (sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    t.NAME NOT LIKE 'dt%' AND
    i.OBJECT_ID > 255 AND   
    i.index_id <= 1
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name, p.[Rows]
ORDER BY 
    object_name(i.object_id) 
Run Code Online (Sandbox Code Playgroud)

在我看来,它比sp_msforeachtable输出更容易处理.

  • @Skaue:如果您将"数据库图表"功能安装到您的数据库中,那么您将拥有一些像`dtProperties`等表格; 既然那些是"系统"表,我不想报告那些. (6认同)

Eri*_*son 97

我在http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=21021上找到的片段帮助了我:

select t.name TableName, i.rows Records
from sysobjects t, sysindexes i
where t.xtype = 'U' and i.id = t.id and i.indid in (0,1)
order by TableName;
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个解决方案,虽然我使用来自sysobjects的内部连接sysindexes的`JOIN`语法`i.id = t.id和i.indid in(0,1)其中t.xtype ='U' (5认同)

pet*_*tra 28

要在SQL Management Studio中获取该信息,请右键单击该数据库,然后选择"报告" - >"标准报告" - >"按表排列的磁盘使用情况".

  • 低估的方法,这会快速生成一个可排序的报告,显示#行和数据大小. (5认同)

小智 8

SELECT 
    T.NAME AS 'TABLE NAME',
    P.[ROWS] AS 'NO OF ROWS'
FROM SYS.TABLES T 
INNER JOIN  SYS.PARTITIONS P ON T.OBJECT_ID=P.OBJECT_ID;
Run Code Online (Sandbox Code Playgroud)

  • 此Query将为每个表上的每个索引返回行结果.添加WHERE P.INDEX_ID IN(0,1)以仅在适当的情况下将返回结果集限制为堆或聚簇索引. (3认同)

KM.*_*KM. 6

如此处所示,这将返回正确的计数,其中使用元数据表的方法仅返回估计值.

    CREATE PROCEDURE ListTableRowCounts 
    AS 
    BEGIN 
        SET NOCOUNT ON 

        CREATE TABLE #TableCounts
        ( 
            TableName VARCHAR(500), 
            CountOf INT 
        ) 

        INSERT #TableCounts
            EXEC sp_msForEachTable 
                'SELECT PARSENAME(''?'', 1), 
                COUNT(*) FROM ? WITH (NOLOCK)' 

        SELECT TableName , CountOf 
            FROM #TableCounts
            ORDER BY TableName 

        DROP TABLE #TableCounts
    END
    GO
Run Code Online (Sandbox Code Playgroud)