Ошибка арифметического переполнения для типа данных 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'