如果使用 sys.columns - 请记住 max_length 列实际上是以字节为单位的最大大小 - 而不是列的实际声明大小。
有关更多信息,请参见此处:MSDN 上的 sys.columns
这适用于 char/varchar(大小为n字节),但对于 nchar 和 nvarchar,字节存储不同,其中n是字符串的长度。
nchar 是 2 n字节,因此您需要max_length/2
获取实际声明的大小(1-4000)
nvarchar 也是 2 n字节,因此您需要(max_length/2)
获取实际声明的大小。尽管 nvarchar 还为每列使用了额外的 2 个字节,但这不包含在 sys.columns.max_length 列中。
还要记住:任何 nvarchar 或 nchar(max) 值都返回 -1
示例代码,选择所有表的所有列并显示类型详细信息:-
SELECT '[' + schema_name(t.[schema_id]) + '].[' + t.name + ']' AS TableName
, '[' + c.name + ']' AS ColumnName
, '[' + ty.name + ']' AS DataType
, max_length_value = CASE WHEN c.max_length > -1
AND (ty.name = 'nvarchar'
OR ty.name = 'nchar') THEN c.max_length/2
ELSE c.max_length END
, max_length_bytes = c.max_length
, c.is_nullable
FROM sys.columns AS c
INNER JOIN sys.tables AS t ON t.object_id = c.object_id
INNER JOIN sys.types AS ty ON ty.system_type_id = c.system_type_id
AND ty.user_type_id = c.user_type_id
来自 MSDN 的 nchar 和 nvarchar:-
nchar [( n )] 固定长度的 Unicode 字符串数据。n 定义字符串长度,并且必须是 1 到 4,000 之间的值。存储大小是 n 字节的两倍。当排序规则代码页使用双字节字符时,存储大小仍为 n 字节。根据字符串,n 字节的存储大小可能小于为 n 指定的值。nchar 的 ISO 同义词是 national char 和 national character。
nvarchar [( n | max )] 可变长度 Unicode 字符串数据。n 定义字符串长度,可以是 1 到 4,000 之间的值。max 表示最大存储大小为 2^31-1 字节(2 GB)。存储大小(以字节为单位)是输入数据实际长度的两倍 + 2 个字节。nvarchar 的 ISO 同义词是国家字符变化和国家字符变化。