SQLServer数据库系统表查询
在 SQL Server 中查询所有表的表名、表注释、字段数量、数据条目数及容量大小等信息,可以通过系统视图、动态管理视图和存储过程的组合实现。
以下是综合多个来源的查询方法:
一、表名与表注释
- 查询表名及注释
SELECT OBJECT_NAME(o.object_id) AS TableName, CAST(ep.value AS NVARCHAR(MAX)) AS TableComment FROM sys.objects o LEFT JOIN sys.extended_properties ep ON o.object_id = ep.major_id AND ep.minor_id = 0 AND ep.name = 'MS_Description' WHERE o.type = 'U'; -- 筛选用户表
- 说明:通过 sys.objects 获取用户表名,结合 sys.extended_properties 提取表注释(需预先通过 sp_addextendedproperty 添加注释)。
二、字段数量
- 统计每个表的字段数
SELECT TABLE_NAME AS TableName, COUNT(COLUMN_NAME) AS ColumnCount FROM INFORMATION_SCHEMA.COLUMNS GROUP BY TABLE_NAME;
- 说明:使用 INFORMATION_SCHEMA.COLUMNS 系统视图按表名分组统计字段数。
三、数据条目数
- 获取表的总行数
SELECT OBJECT_NAME(p.object_id) AS TableName, SUM(p.rows) AS TotalRows FROM sys.dm_db_partition_stats p WHERE index_id IN (0, 1) -- 堆或聚集索引 GROUP BY p.object_id;
- 说明:sys.dm_db_partition_stats 提供实时行数统计,适用于 SQL Server 2005 及以上版本。
- 替代方法(旧版本):
SELECT a.name AS TableName, b.rows AS TotalRows FROM sysobjects a INNER JOIN sysindexes b ON a.id = b.id WHERE a.xtype = 'U' AND b.indid IN (0, 1);
注意:此方法可能返回近似值,需定期更新统计(DBCC UPDATEUSAGE)。
四、容量大小
- 查询表的存储空间
- 方法一:使用 sp_spaceused 存储过程
EXEC sp_spaceused 'TableName'; -- 单个表
结果包含 reserved(总空间)、data(数据空间)、index_size(索引空间)等字段。
- 方法二:动态管理视图
SELECT OBJECT_NAME(p.object_id) AS TableName, SUM(reserved_page_count) * 8 / 1024.0 AS TotalSpaceMB FROM sys.dm_db_partition_stats p GROUP BY p.object_id;
通过计算页数(每页8KB)转换为 MB。
五、综合查询示例
结合上述信息,以下脚本可一次性获取所有表的关键信息:
SELECT t.NAME AS TableName, CAST(ep.value AS NVARCHAR(MAX)) AS TableComment, (SELECT COUNT(*) FROM sys.columns c WHERE c.object_id = t.object_id) AS ColumnCount, p.rows AS TotalRows, (SUM(a.used_pages) * 8) / 1024.0 AS UsedSpaceMB, (SUM(a.total_pages) * 8) / 1024.0 AS TotalSpaceMB FROM sys.tables t LEFT JOIN sys.extended_properties ep ON t.object_id = ep.major_id AND ep.minor_id = 0 AND ep.name = 'MS_Description' 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 GROUP BY t.object_id, t.NAME, ep.value, p.rows;
注意事项
- 权限要求:需对系统视图(如 sys.tables)有读取权限。
- 注释管理:若未手动添加表注释,TableComment 字段可能为空。
- 实时性:动态管理视图(如 sys.dm_db_partition_stats)数据更准确,sysindexes 可能需更新统计。
可通过以上方法灵活组合,满足不同场景的元数据管理需求。
本文来自博客园,作者:业余砖家,转载请注明原文链接:https://www.cnblogs.com/yeyuzhuanjia/p/18869315

浙公网安备 33010602011771号