Тип данных операнда void недопустим для оператора sum

у меня был бы вопрос об использовании null.

Если я запускаю этот запрос

SELECT SUM(x)
FROM (SELECT NULL AS x) AS DerivedTable

Я получаю сообщение об ошибке

" тип данных операнда void недопустим для оператора sum."

однако, если я создам таблицу с полем nullable и использую ее в Sum aggregate, она проигнорирует значение NULL и в основном сложит все остальные записи.

CREATE TABLE #temp1(x int)
insert into #temp values (NULL),(3),(5)

SELECT SUM(x) FROM #temp1 

результат 8.

есть логическое объяснение этого? Было бы это из-за того, что тип данных NULL не был объявлен в запросе с производной таблицей, но был объявлен с временной таблицей? Кроме того, я хотел бы знать, есть ли способ создать это сообщение об ошибке при запуске из таблицы или производной таблицы, как и во втором примере #temp1. Любой пример, который создает это сообщение об ошибке при запуске из таблицы или табличного выражения, приветствуется.

спасибо всем

1 ответов


Это действительно так тип столбца не может быть презюмировано в сценарии производной таблицы.

Если вы измените оператор и явно используете тип в столбце, select будет работать.

SELECT SUM(x) FROM (SELECT CAST(NULL AS INTEGER) AS x) AS DerivedTable

как и следующий оператор, где тип может быть выведен

SELECT SUM(x) FROM (SELECT NULL AS x UNION SELECT 1) AS DerivedTable

SQL Fiddle


Это также ответит на ваш второй вопрос. Как вы не можете создать таблицу без объявления типы, нет способа создать оператор, который будет генерировать это конкретное сообщение об ошибке.