Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: krulОтветов: 2

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

@myParam nvarchar(size)

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

CAST(@myParam AS nvarchar(size))

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

CAST(@myParam AS nvarchar)

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

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

sqlsql-servertsql

Ответы

Ответ 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 по умолчанию;) .

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы