Ошибка арифметического переполнения для типа данных tinyint, значение = -1
при запуске этого запроса я получаю ошибку, любая идея, почему?
select ISNULL(NULLIF(0,0), -1)
ошибка :
Msg 220, Уровень 16, Состояние 2, Строка 1
ошибка арифметического переполнения для типа данных tinyint, значение = -1.
EDIT -- другой пример:
select ISNULL(NULLIF(0.0,0.0), 1.0)
Msg 8115, Уровень 16, Состояние 8, Строка 1 Ошибка арифметического переполнения при преобразовании numeric в тип числовых данных.
1 ответов
эту работу:
select ISNULL(NULLIF(cast(0 as int),0), -1)
SQL optimalizer делает" скрытый " приведение к наименьшему типу данных.
из документации NULLIF (http://technet.microsoft.com/pl-pl/library/ms177562%28v=sql.110%29.aspx):
возвращает тот же тип, что и первое выражение.
поэтому NULLIF возвращает tinyint и isnull пытается заменить tinyint на -1, а затем у вас есть переполнение
при приведении первого параметра (0) к int (или smallint) NULLIF возвращает ваш "новый" тип данных, который подходит для -1
чтобы найти используемый фактический тип:
SELECT NULLIF(0,0) test_col INTO #test_table
SELECT data_type, numeric_precision, numeric_scale
FROM tempdb.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE '#test_table%' AND COLUMN_NAME = 'test_col'