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

相关推荐
小徐不徐说4 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
论文复现现场4 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
Decay__5 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
心梦缘-雪雁6 小时前
SQL Server 查询数据存在哪个表里
数据库
lusklusklusk7 小时前
Python 巡检脚本:进程运行状态、数据库写入时效检查及邮件通知与告警
数据库·python·oracle
GeW8 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
SelectDB8 小时前
Doris Arrow Flight SQL 高速读取协议实战:与 Snowflake 客户端取数链路对照
大数据·数据库·数据分析
曼岛_8 小时前
[图解密码学]第4章 古典密码
java·数据库·密码学
瀚高PG实验室9 小时前
HGDB V9.0.5 .pgpass 免密登录提示 IsEncryptNon-base64 encoding 警告处理
数据库·postgresql·瀚高数据库
龙腾AI白云9 小时前
大模型检索增强生成(RAG)的技术原理与架构设计
数据库·python·机器学习·知识图谱