Подтвердить что ты не робот

Почему cast/convert from int возвращает звездочку

Кто-то недавно задал мне этот вопрос, и я подумал, что отправлю его в Stack Overflow, чтобы получить некоторые данные.

Теперь очевидно, что оба следующих сценария должны потерпеть неудачу.

# 1:

DECLARE @x BIGINT
SET @x = 100
SELECT CAST(@x AS VARCHAR(2))

Очевидная ошибка:

Msg 8115, уровень 16, состояние 2, строка 3
Ошибка арифметического переполнения, преобразующая выражение в тип данных varchar.

# 2:

DECLARE @x INT
SET @x = 100
SELECT CAST(@x AS VARCHAR(2))

Не очевидно, он возвращает a * (Можно было бы ожидать, что это тоже будет арифметическое переполнение???)


Теперь мой реальный вопрос: почему??? Это просто по дизайну или есть история или что-то зловещий за этим?

Я просмотрел несколько сайтов и не смог получить удовлетворительный ответ.

например. http://beyondrelational.com/quiz/sqlserver/tsql/2011/info/Why-does-CAST-function-return-an-asterik--star.aspx

http://msdn.microsoft.com/en-us/library/aa226054(v=sql.80).aspx

Обратите внимание: я знаю/понимаю, что, когда целое число слишком велико, чтобы преобразовать его в строку определенного размера, которая будет "преобразована" в звездочку, это очевидный ответ, и я бы хотел, чтобы я мог сжать всех который продолжает давать этот ответ. Я хочу знать, почему используется звездочка, а не исключение, например. исторические причины и т.д.

4b9b3361

Ответ 1

Для еще большего удовольствия попробуйте следующее:

DECLARE @i INT
SET @i = 100
SELECT CAST(@i AS VARCHAR(2)) -- result: '*'
go

DECLARE @i INT
SET @i = 100
SELECT CAST(@i AS NVARCHAR(2)) -- result: Arithmetic overflow error

:)


Ответ на ваш запрос: "Исторические причины"

Типы данных INT и VARCHAR старше BIGINT и NVARCHAR. Много старше. Фактически они находятся в исходных спецификациях SQL. Также более старый - это метод подавления исключения, который заменяет вывод звездочками.

Позже, люди SQL решили, что ошибка была лучше/согласована и т.д., чем подставлять фиктивные (и обычно запутывающие) выходные строки. Однако для согласованности они сохранили предыдущее поведение для существующих комбинаций типов данных (чтобы не нарушать существующий код).

Итак (позже), когда были добавлены типы данных BIGINT и NVARCHAR, они получили новое (er) поведение, потому что они не были покрыты упомянутым выше дедушкой.

Ответ 2

Вы можете прочитать на странице CAST и CONVERT в разделе "Результаты усечения и округления". Int, smallint и tinyint вернут *, когда длина результата слишком мала, чтобы отображать при преобразовании в char или varchar. Другие числовые преобразования в строку возвращают ошибку.