SQL Server 查询表结构与数据行数的 SQL 语句总结
学习笔记作者:admin日期:2025-09-18点击:11
摘要:本文介绍了如何使用 SQL Server 查询表结构(包括表名、字段名、字段类型和字段说明)以及查询每个表的数据行数。通过系统视图和扩展属性,可以高效获取数据库元信息,并提供示例代码及使用建议。
SQL Server 查询表结构与数据行数的 SQL 语句总结
1. 查询表结构信息(表名、字段名、字段类型、字段说明)
在 SQL Server 中,可以通过 INFORMATION_SCHEMA.COLUMNS
和 sys.extended_properties
系统视图来获取表结构信息,包括表名、字段名、字段类型和字段说明。
SELECT
t.TABLE_NAME AS 表名,
c.COLUMN_NAME AS 字段名,
CASE
WHEN c.DATA_TYPE IN ('varchar', 'char', 'nvarchar', 'nchar')
THEN c.DATA_TYPE + '(' +
CASE WHEN c.CHARACTER_MAXIMUM_LENGTH = -1 THEN 'MAX'
ELSE CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR(10))
END + ')'
WHEN c.DATA_TYPE IN ('decimal', 'numeric')
THEN c.DATA_TYPE + '(' + CAST(c.NUMERIC_PRECISION AS VARCHAR(3)) + ',' + CAST(c.NUMERIC_SCALE AS VARCHAR(3)) + ')'
ELSE c.DATA_TYPE
END AS 字段类型,
ISNULL(ep.value, '') AS 字段说明
FROM
INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.COLUMNS c
ON t.TABLE_NAME = c.TABLE_NAME
AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
LEFT JOIN sys.extended_properties ep
ON OBJECT_ID(t.TABLE_SCHEMA + '.' + t.TABLE_NAME) = ep.major_id
AND c.ORDINAL_POSITION = ep.minor_id
AND ep.name = 'MS_Description'
AND ep.class = 1 -- 1 表示是列级别的扩展属性
WHERE
t.TABLE_TYPE = 'BASE TABLE'
AND t.TABLE_SCHEMA = 'dbo' -- 可根据需要修改 Schema,如 'dbo'
ORDER BY
t.TABLE_NAME,
c.ORDINAL_POSITION;
2. 查询表的数据行数
若要查询每个表的名称及其对应的数据行数(即表中的记录总数),可以使用 sys.tables
、sys.schemas
和 sys.partitions
系统视图。
SELECT
t.NAME AS 表名,
SUM(p.rows) AS 数据行数
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 = 堆表, 1 = 聚集索引,每个表只计一次数据行
AND s.name = 'dbo' -- 可根据需要修改 Schema,如 'dbo'
AND t.is_ms_shipped = 0 -- 排除系统自带的表
GROUP BY
t.NAME
ORDER BY
数据行数 DESC;
3. 使用建议
- 如果只想查某个表,可以在
WHERE
后加:AND t.TABLE_NAME = 'YourTableName'
- 如果表不在
dbo
模式下,请修改t.TABLE_SCHEMA = 'dbo'
为对应的 Schema 名称。 - 确保数据库中已为列添加了描述(通过
sp_addextendedproperty
添加),否则“字段说明”为空。
4. 示例添加字段说明
EXEC sp_addextendedproperty
@name = N'MS_Description',
@value = N'用户姓名',
@level0type = N'SCHEMA', @level0name = 'dbo',
@level1type = N'TABLE', @level1name = 'Users',
@level2type = N'COLUMN', @level2name = 'UserName';
5. 注意事项
- 此方法返回的是近似行数(由 SQL Server 统计信息维护),在大多数情况下是准确的,但若刚发生大量增删操作,可能略有延迟。
- 如果需要绝对精确SELECT COUNT(*) FROM 表名,但性能较差,尤其对大表。