Преобразование значения int в слишком маленький символ - PullRequest
3 голосов
/ 30 июня 2010

Попробуйте выполнить следующие действия в MSSQL 2005:

select convert(char(2), 123)

Ключевым моментом здесь является то, что char (2) слишком мала, чтобы принять значение «123».Я ожидаю увидеть здесь ошибку усечения, но вместо этого возвращается значение "*".

Обновление: В нескольких ответах показано, как выполнить приведение таким образом, чтобы вызватьошибка.Это не совсем то, что мне нужно.У нас есть много кода, который использует определенное поле, которое раньше было объявлено как char (2), но с тех пор было изменено на int.Моя цель здесь - убедиться, что код, который не был преобразован, упадет, если он встретит данные, которые он не может обработать.Итак, мы можем исправить это.

Интересно, что dsolimano отмечает, что изменение указанного выше типа на nchar вызывает ожидаемую ошибку, а Джастин Нисснер отмечает, что обапо дизайну.Странное несоответствие, учитывая, что nchar для поддержки Unicode, а?

Из ответов, которые у меня есть, кажется, что я, к сожалению, не могу заставить сервер выдать ошибку для существующего кода.

Ответы [ 5 ]

2 голосов
/ 30 июня 2010

Страница конвертирования / приведения Microsoft , кажется, указывает на то, что вы можете привести к nchar (2), если хотите получить ошибку вместо * или усечение, и это действительно то, что я получаю:

SELECT CAST(123 AS NCHAR(2))

Msg 8115, Level 16, State 2, Line 3
Arithmetic overflow error converting expression to data type nvarchar.
1 голос
/ 30 июня 2010

Прокрутите вниз следующую страницу MSDN:

CAST и CONVERT (Transact-SQL)

Пока не дойдете до заголовка Результаты усечения и округления

Вы увидите, что поведение, которое вы видите, является определенным поведением.

Если вы хотите, чтобы усечение происходило так, чтобы вы получили только две цифры числа, то вы можете попробовать:

select cast(convert(varchar(10), 123) as char(2))
0 голосов
/ 30 июня 2010

Зависит от того, что вы подразумеваете под «предотвратить» это происходит? Что бы вы хотели вместо этого? Ничего?

DECLARE @number INT
SET @number = 123

IF(@number < 100) SELECT CONVERT(char(2), @number)
0 голосов
/ 30 июня 2010

SQL Server будет обрезать строки без проблем.Таким образом, вы можете сначала преобразовать значение в varchar, а затем привести к char(2):

select convert(char(2), cast(123 as varchar(128))
0 голосов
/ 30 июня 2010

Просто приведите его к строке переменной длины перед тем, как привести к слишком маленькой строке.

Select Cast( Cast( 123 as varchar(10) ) As char(2) )
...