Каков эффект от пропуска размера в объявлении nvarchar - PullRequest
18 голосов
/ 15 июля 2009

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

@myParam nvarchar(size)

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

CAST(@myParam AS nvarchar(size))

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

CAST(@myParam AS nvarchar)

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

Есть комментарии?

Ответы [ 2 ]

20 голосов
/ 15 июля 2009

Если вы опустите размер, по умолчанию будет 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))

Комментарий @ Крула; 30 - длина по умолчанию для CAST; однако длина по умолчанию для определения данных или объявления переменной равна 1.

Примечание: есть также функция STR , которая преобразует числовые поля в строки, для которых длина по умолчанию равна 10.

--outputs: 1234567890
select str(1234567890)

--outputs: **********
select str(12345678901)

--outputs: 12345678901
select str(12345678901,11)
5 голосов
/ 15 июля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...