sys.columns を使用している場合 - max_length 列は実際にはバイト単位の最大サイズであり、実際に宣言された列のサイズではないことに注意してください。
詳細については、こちらを参照してください: MSDN の sys.columns
これは char/varchar (サイズはnバイト) では正常に機能しますが、nchar と nvarchar ではバイト ストレージが異なります。nは文字列の長さです。
nchar は 2 nmax_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 バイトの 2 倍です。照合コード ページで 2 バイト文字が使用されている場合でも、ストレージ サイズは n バイトのままです。文字列によっては、n バイトのストレージ サイズが n に指定された値よりも小さくなる場合があります。nchar の ISO シノニムは、国別文字および国別文字です。
nvarchar [( n | max )] 可変長の Unicode 文字列データ。n は文字列の長さを定義し、1 ~ 4,000 の値を指定できます。max は、最大ストレージ サイズが 2^31-1 バイト (2 GB) であることを示します。ストレージ サイズ (バイト単位) は、入力されたデータの実際の長さの 2 倍 + 2 バイトです。nvarchar の ISO シノニムは、国別文字可変および国別文字可変です。