Обычно я определяю размер при объявлении параметров в моем SP, например:
@myParam nvarchar(size)
или когда я бросаю или конвертирую:
CAST(@myParam AS nvarchar(size))
Недавно я удалил размер из своих функций CAST, таких как:
CAST(@myParam AS nvarchar)
и я немного беспокоюсь, если это придет и укусит меня, когда меньше всего ожидаешь :-(, так как я заметил усечение переменных nvarchar при использовании рекурсивного CTE и приведении nvarchar без указания размера.
Любые комментарии?
Ответ 1 · рейтинг 24 · David M
Если вы не укажете размер, по умолчанию он равен 30. См. это:
http://msdn.microsoft.com/en-us/library/ms186939.aspx
Чтобы увидеть это в действии, попробуйте выполнить следующие операторы:
--outputs: 12345678901234567890.098765432
select cast (12345678901234567890.098765432 as nvarchar)
--throws "Arithmetic overflow error converting expression to data type nvarchar."
select cast (12345678901234567890.0987654321 as nvarchar)
--outputs: 12345678901234567890.0987654321
select cast (12345678901234567890.0987654321 as nvarchar(31))
Согласно комментарию @krul; 30 - длина по умолчанию для CAST; однако длина по умолчанию для определения данных или объявления переменной равна 1.
NB: существует также функция STR. который преобразует числовые поля в строки, для которых длина по умолчанию равна 10.
--outputs: 1234567890
select str(1234567890)
--outputs: **********
select str(12345678901)
--outputs: 12345678901
select str(12345678901,11)
Ответ 2 · рейтинг 5 · Yishai
Он установит размер по умолчанию и обрежет остальные. Это действительно может вас укусить, если только размер по умолчанию не подходит.
Событие, я бы посоветовал вам всегда указывать размер, чтобы было ясно, каким, по вашему мнению, будет размер, вместо того, чтобы следующий человек, который читает код, должен был прийти в SO, чтобы спросить, каков размер nvarchar по умолчанию;) .