Почему SELECT ISNULL(NULL, NULL)
возвращает столбец типа INT
Литерал NULL
без какого-либо другого контекста обычно рассматривается как int
в SQL Сервер. Так что это согласуется с «возвращает тот же тип, что и check_expression
».
Вы также можете увидеть это, если выполните SELECT NULL AS Col INTO SomeTable
и посмотрите на созданный тип данных столбца.
Или снова можете увидеть его в этом глупом рекурсивном примере CTE
WITH R(C) AS
(
SELECT NULL
UNION ALL
SELECT 0.0 FROM R WHERE 1 = 0
)
SELECT *
FROM R
Который возвращает
Msg 240, уровень 16, состояние 1, строка 1 Типы не совпадают между якорем и рекурсивной частью в столбце "C" рекурсивного запроса "R".
Но отлично работает с 0.0
, замененным на 0
, поэтому столбец в рекурсивной части равен int
, а не decimal
.
Почему он ведет себя как это?
Это именно то, что SQL Сервер решил go с обратным временем, когда. Я сомневаюсь, что они изменили бы поведение по причинам обратной совместимости, даже если это немного произвольно и , вероятно, не соответствует SQL Стандарту
Несколько произвольный характер всего этого также показан вверх на
SELECT NULLIF(NULL, NULL)
Вы можете ожидать, что это будет вести себя так же и возвращать INT
, но вместо этого вы получите ошибку
Тип первого аргумента для NULLIF не может быть константой NULL, поскольку должен быть известен тип первого аргумента.
И COALESCE(NULL,NULL)
возвращает
По крайней мере один из аргументов COALESCE должен быть выражение, которое не является константой NULL.