SQL Server查询所有表数据量的代码实例实用指南

作者:袖梨 2026-09-07

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“SQL Server查询所有表数据量的代码实例”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

目录
  • 1.查询当前数据库中所有用户表的数据量(即每个表的记录数)
  • 2.在1的基础上增加显示数据库名
  • 3.跨所有数据库查询每个数据库中每张表的数据量(行数)
  • 总结

1.查询当前数据库中所有用户表的数据量(即每个表的记录数)

SELECT  a.name ,  b.rows  FROM    sysobjects AS a

       INNER JOIN sysindexes AS b ON a.id = b.id
WHERE ( a.type = 'u' ) AND ( b.indid IN ( 0, 1 ) )
ORDER BY b.rows DESC

SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts
FROM
    sys.tables t
INNER JOIN
    sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN
    sys.partitions p ON t.object_id = p.object_id
WHERE
    p.index_id IN (0, 1) -- 0 = heap table, 1 = clustered index
GROUP BY
    t.Name, s.Name, p.Rows
ORDER BY
    p.rows DESC;

说明:
sys.tables:拿到数据库中所有用户表。

sys.partitions:每个表(或分区)在物理存储层面的分区信息,包含记录数(rows)。

从实现思路看,index_id IN (0, 1):过滤掉非主数据行的分区(如非聚集索引的副本)。

2.在1的基础上增加显示数据库名

SELECT 
    DB_NAME() AS DatabaseName,
    t.NAME AS TableName,
    s.Name AS SchemaName,
    SUM(p.rows) AS RowCounts
FROM
    sys.tables t
INNER JOIN
    sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN
    sys.partitions p ON t.object_id = p.object_id
WHERE
    p.index_id IN (0, 1)
GROUP BY
    t.Name, s.Name
ORDER BY
    RowCounts DESC;

3.跨所有数据库查询每个数据库中每张表的数据量(行数)

理解这一步时,需跨多个数据库查,能够采用 sp_MSforeachdb 或手动遍历数据库执行2中语句。

落到代码里,跨所有数据库查询每个数据库中每张表的数据量(行数),采用 sp_MSforeachdb 系统存储过程完成:

EXEC sp_MSforeachdb N'
USE [?];

IF DB_ID() NOT IN (1, 2, 3, 4) -- 排除系统数据库(master, tempdb, model, msdb)
BEGIN
    PRINT ''Database: [?]'';
    SELECT
        DB_NAME() AS DatabaseName,
        s.name AS SchemaName,
        t.name AS TableName,
        SUM(p.rows) AS RowCounts
    FROM
        sys.tables t
    INNER JOIN
        sys.schemas s ON t.schema_id = s.schema_id
    INNER JOIN
        sys.partitions p ON t.object_id = p.object_id
    WHERE
        p.index_id IN (0, 1)
    GROUP BY
        s.name, t.name
    ORDER BY
        RowCounts DESC;
END
';

说明:
sp_MSforeachdb:遍历所有数据库。

USE [?]:在遍历时切换数据库上下文。

IF DB_ID() NOT IN (……):排除系统数据库。

每个数据库都会输出一个标题,然后列出其所有表及记录数。

注意事项:
该语句需以 sa 或具有跨库权限的账户执行。

落到代码里,sp_MSforeachdb 是未文档化的存储过程,虽然广泛采用但微软不建议用来关键任务。如果需更稳健的版本可考虑自己实现游标版本。

总结

到此这篇关于SQL Server查询所有表数据量的文章就介绍到这了,更多相关SQLServer查询所有表数据量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!

您可能感兴趣的文章:
  • SQL Server查询所有表格及字段的示例

相关文章

精彩推荐