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(表示可变最大)

相关推荐
wayuncn41 分钟前
哈尔滨电商企业服务器托管方案
运维·服务器·数据库
重整旗鼓~1 小时前
27.Redisson基本使用和可重入性
数据库·redis·缓存
瑶总迷弟1 小时前
使用 Docker 和 docker-compose 快速部署 openGauss
linux·数据库·云原生·eureka
C.R.xing2 小时前
Pyspark分布式访问NebulaGraph图数据库
数据库·分布式·python·pyspark·nebulagraph
九皇叔叔2 小时前
深度解析 PostgreSQL 中的 ctid、xmin、xmax:从原理到实战
数据库·postgresql
殷丿grd_志鹏2 小时前
开源项目RuoYi-Cloud-Plus详解——公网内网穿透到虚拟机环境(持续更新)
数据库·开源·内网穿透·虚拟机
木易 士心2 小时前
AI 在数据库操作中的各类应用场景、方案与实践指南
数据库·人工智能·oracle
SunsPlanter2 小时前
苍穹外卖--04--Redis 缓存菜品信息、购物车
数据库·redis·缓存
解决问题no解决代码问题3 小时前
oracle删除表与表空间清理机制
数据库·oracle
程序员三明治4 小时前
【Mybatis从入门到入土】ResultMap映射、多表查询与缓存机制全解析
java·sql·缓存·mybatis·resultmap·缓存机制·多表查询