SQL Server 查询数据库中所有表中所有字段的数据类型及长度

1.查看所有表字段的(数据类型 + 长度描述 + 实际长度(字节))

复制代码
SELECT 
    s.name AS SchemaName,
    t.name AS TableName,
    c.name AS ColumnName,
    
    -- 数据类型 + 长度拼接(用于显示)
    ty.name +
        CASE 
            WHEN ty.name IN ('char', 'varchar', 'nchar', 'nvarchar') 
                THEN '(' + 
                    CASE 
                        WHEN c.max_length = -1 THEN 'MAX'
                        ELSE 
                            CAST(
                                CASE 
                                    WHEN ty.name IN ('nchar', 'nvarchar') THEN c.max_length / 2
                                    ELSE c.max_length
                                END AS VARCHAR
                            )
                    END + ')'
            WHEN ty.name IN ('decimal', 'numeric') 
                THEN '(' + CAST(c.precision AS VARCHAR) + ',' + CAST(c.scale AS VARCHAR) + ')'
            ELSE ''
        END AS DataTypeWithLength,

    -- 实际长度(字节)
    c.max_length AS ActualLengthBytes,

    c.is_nullable

FROM 
    sys.columns c
    INNER JOIN sys.tables t ON c.object_id = t.object_id
    INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
    INNER JOIN sys.types ty ON c.user_type_id = ty.user_type_id
ORDER BY 
    s.name, t.name, c.column_id;

说明:

SchemaName:表所属的 schema,例如 dbo

TableName:表名

ColumnName:字段名

DataTypeWithLength:数据类型及长度,如nvarchar(20)

is_nullable:是否允许 NULL(0代表否,1代表是)

2.如果你希望显示"字符长度"而不是字节数,可使用如下SQL

复制代码
SELECT 
    s.name AS SchemaName,
    t.name AS TableName,
    c.name AS ColumnName,

    -- 数据类型 + 长度/精度拼接
    ty.name +
        CASE 
            WHEN ty.name IN ('char', 'varchar', 'nchar', 'nvarchar') 
                THEN '(' + 
                    CASE 
                        WHEN c.max_length = -1 THEN 'MAX'
                        ELSE 
                            CAST(
                                CASE 
                                    WHEN ty.name IN ('nchar', 'nvarchar') 
                                        THEN c.max_length / 2
                                    ELSE c.max_length
                                END AS VARCHAR
                            )
                    END + ')'
            WHEN ty.name IN ('decimal', 'numeric') 
                THEN '(' + CAST(c.precision AS VARCHAR) + ',' + CAST(c.scale AS VARCHAR) + ')'
            ELSE ''
        END AS DataTypeWithLength,

    -- 实际长度(字节)
    c.max_length AS ActualLengthBytes,

    -- 实际长度(字符数)
    CASE 
        WHEN ty.name IN ('nchar', 'nvarchar') THEN 
            CASE WHEN c.max_length = -1 THEN -1 ELSE c.max_length / 2 END
        ELSE 
            CASE WHEN c.max_length = -1 THEN -1 ELSE c.max_length END
    END AS ActualLengthChars,

    -- 是否可为空
    c.is_nullable

FROM 
    sys.columns c
    INNER JOIN sys.tables t ON c.object_id = t.object_id
    INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
    INNER JOIN sys.types ty ON c.user_type_id = ty.user_type_id

ORDER BY 
    s.name, t.name, c.column_id;

说明:

ActualLengthBytes:SQL Server 存储字段时使用的字节数

ActualLengthChars:你定义的字符数,比如 nvarchar(50) 实际为 50 字符,但占用 100 字节

MAX 类型会显示为 -1(表示可变最大)

相关推荐
014-code10 分钟前
MySQL 很实用的 SQL 语句清单(排障与日常运维)
sql·mysql
空空潍12 分钟前
Spring AI 实战系列(十):MCP深度集成 —— 工具暴露与跨服务调用
数据库·人工智能·spring
bIo7lyA8v13 分钟前
从 ChangeTracker 到 SQL Batch 的性能诊断与优化
数据库·sql·batch
Yiyi_Coding14 分钟前
Oracle 、 Mysql、Guass 的 sequence
数据库·mysql·oracle
蒸汽求职1 小时前
低延迟系统优化:针对金融 IT 与高频交易,如何从 CPU 缓存行(Cache Line)对齐展现硬核工程底蕴?
sql·算法·缓存·面试·职场和发展·金融·架构
数智化管理手记9 小时前
精益生产中的TPM管理是什么?一文破解设备零故障的密码
服务器·网络·数据库·低代码·制造·源代码管理·精益工程
翊谦9 小时前
Java Agent开发 Milvus 向量数据库安装
java·数据库·milvus
難釋懷10 小时前
OpenResty实现Redis查询
数据库·redis·openresty
别抢我的锅包肉10 小时前
【MySQL】第四节 - 多表查询、多表关系全解析
数据库·mysql·datagrip