Нижеприведенный запрос неожиданно завершается с ошибкой арифметического переполнения.Почему этот запрос SQL не работает
select IsNull(t2.val, 5005)
from(
SELECT 336.6 as val UNION ALL
SELECT NULL
) as t2
«Арифметическая ошибка переполнения, преобразующая int в тип данных числовой».
Как ни странно, если запрос модифицирован, чтобы удалить NULL и заменить его на ту же величину, как и в нулевой сливаются (5005), она работает без проблем
select IsNull(t2.val, 5005)
from(
SELECT 336.6 as val UNION ALL
SELECT 5005
) as t2
Кроме того, опуская SELECT, строка NULL, полностью позволяет запрос для запуска без проблем
select IsNull(t2.val, 5005)
from(
SELECT 336.6 as val
) as t2
Если значение сливается в функции IsNull изменяется на целое число, которое достаточно мало, чтобы преобразовать в десятичном в подзапросе без расширения, то запрос выполняется
select IsNull(t2.val, 500)
from(
SELECT 336.6 as val UNION ALL
SELECT NULL
) as t2
Испытано это как в SQL Server 2005 и SQL Server 2008.
Обычно объединение целых чисел с десятичными знаками бесшовный и SQL Server преобразует как целое число и десятичный в десятичный тип достаточно большой, чтобы вместить обоих. Но по какой-то причине выполняется запрос, в котором кастинг происходит как из UNION, так и из IsNull, приводит к сбою приведения.
Кто-нибудь знает, почему это так?
Ни один из ответов пока не объясняет, почему разница между 'ISNULL' и' COALESCE'. Первая строго возвращает тип данных первого аргумента, второй смотрит на все аргументы. например см. 'DECLARE @X VARCHAR (3) SELECT ISNULL (@ X,« Дольше трех символов »), COALESCE (@ X,« Дольше трех символов »)' –
В вопросе упоминается «COALESCE» кратко, но затем резюме последнего абзаца вопрос только о 'ISNULL'. Но спасибо за хороший комментарий. – Szymon
@ Шимон - Да, ты прав. Должно быть, просто просмотрел, что он видел как «ISNULL», так и «COALESCE», и предположил, что это один из тестовых случаев. –