Каков эффект пропуска размера в объявлении nvarchar

Обычно я определяю размер при объявлении параметров в моем SP, например:

@myParam nvarchar(size)

или когда я бросаю или конвертирую:

CAST(@myParam AS nvarchar(size))

Недавно я удалил размер из своих функций CAST, таких как:

CAST(@myParam AS nvarchar)

и я немного беспокоюсь, если это придет и укусит меня, когда меньше всего ожидаешь :-(, так как я заметил усечение переменных nvarchar при использовании рекурсивного CTE и приведении nvarchar без указания размера.

Любые комментарии?


person krul    schedule 15.07.2009    source источник


Ответы (2)


Если вы не укажете размер, по умолчанию он равен 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)
person David M    schedule 15.07.2009
comment
Большое спасибо, это проясняет ситуацию: когда n не указано в операторе определения данных или объявления переменной, длина по умолчанию равна 1. Когда n не указано с помощью функции CAST, длина по умолчанию равна 30. - person krul; 15.07.2009

Он установит размер по умолчанию и обрежет остальные. Это действительно может вас укусить, если только размер по умолчанию не подходит.

Событие, я бы посоветовал вам всегда указывать размер, чтобы было ясно, каким, по вашему мнению, будет размер, вместо того, чтобы следующий человек, который читает код, должен был прийти в SO, чтобы спросить, каков размер nvarchar по умолчанию;) .

person Yishai    schedule 15.07.2009