SQLServer数据库系统表查询

在 SQL Server 中查询所有表的表名、表注释、字段数量、数据条目数及容量大小等信息,可以通过系统视图、动态管理视图和存储过程的组合实现。

以下是综合多个来源的查询方法:

​​一、表名与表注释​​

  1. 查询表名及注释
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 添加注释)。

 

二、字段数量​​

  1. 统计每个表的字段数
SELECT
    TABLE_NAME AS TableName,
    COUNT(COLUMN_NAME) AS ColumnCount
FROM INFORMATION_SCHEMA.COLUMNS
GROUP BY TABLE_NAME;
    • 说明​:使用 INFORMATION_SCHEMA.COLUMNS 系统视图按表名分组统计字段数。

 

​​三、数据条目数​​

  1. 获取表的总行数
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)。

 

​​四、容量大小​​

  1. 查询表的存储空间
    • 方法一:使用 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;

 

​​注意事项​​

  1. 权限要求​:需对系统视图(如 sys.tables)有读取权限。
  2. 注释管理​:若未手动添加表注释,TableComment 字段可能为空。
  3. 实时性​:动态管理视图(如 sys.dm_db_partition_stats)数据更准确,sysindexes 可能需更新统计。

可通过以上方法灵活组合,满足不同场景的元数据管理需求。

 

posted @ 2025-05-10 09:55  业余砖家  阅读(233)  评论(0)    收藏  举报