Почему ISNULL (NULL, NULL) возвращает тип данных int? - PullRequest
0 голосов
/ 01 марта 2020

На основе раздела «Типы возврата» в документации на ISNULL():

Возвращает тот же тип, что и check_expression . Если литерал NULL указан как check_expression , возвращает тип данных replace_value . Если литерал NULL задан как check_expression и нет replace_value , возвращает int.

Почему ISNULL() возвращает int в этом случае?

1 Ответ

8 голосов
/ 01 марта 2020

Почему 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...