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