При использовании sys.columns - помните, что столбец max_length фактически является максимальным размером в байтах, а не фактическим объявленным размером столбца.
См. Здесь для получения дополнительной информации: sys.columns на MSDN
Это нормально работает для 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
nchar и nvarchar от MSDN : -
* +1033 *
NCHAR [(* 1 036 * п )]
Строковые данные Unicode фиксированной длины. n определяет длину строки и должен быть значением от 1 до 4000. Размер хранилища составляет два раза n байтов. Когда кодовая страница сопоставления использует двухбайтовые символы, размер хранилища по-прежнему составляет n байтов. В зависимости от строки размер хранилища n байтов может быть меньше значения, указанного для n. Синонимами ISO для nchar являются национальный символ и национальный символ.
NVARCHAR [( п | макс )]
Строковые данные Unicode переменной длины. n определяет длину строки и может принимать значение от 1 до 4000. max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байт (2 ГБ). Размер хранилища в байтах в два раза превышает фактическую длину введенных данных + 2 байта. Синонимы ISO для nvarchar - это разные национальные символы и разные национальные символы.