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

相关推荐
GottdesKrieges11 分钟前
obd运维OceanBase数据库的常见场景
运维·数据库·oceanbase
慢慢沉1 小时前
Lua(数据库访问)
开发语言·数据库·lua
技术卷4 小时前
详解力扣高频 SQL 50 题之584. 寻找用户推荐人【入门】
sql·leetcode·oracle
武子康5 小时前
Java-82 深入浅出 MySQL 内部架构:服务层、存储引擎与文件系统全覆盖
java·开发语言·数据库·学习·mysql·spring·微服务
vdoi8 小时前
【Mysql】 Mysql zip解压版 Win11 安装备忘
数据库·mysql
TDengine (老段)8 小时前
TDengine 转化类函数 TO_CHAR 用户手册
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
程序员编程指南9 小时前
Qt 与 SQLite 嵌入式数据库开发
c语言·数据库·c++·qt
fht19 小时前
SQLite
数据库·sqlite
float_六七10 小时前
MySQL索引背后的B+树奥秘
数据库·b树·mysql
~央千澈~10 小时前
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
数据库·mongodb