Проблемы
Рассмотрим следующий сценарий.
-
У вас есть компьютер, на котором установлен Microsoft SQL Server 2012.
-
У вас есть запрос, содержащий оператор case в инструкции SELECT и оператор case в инструкции Group By .
-
Два оператора case оцениваются как null.
-
Вы запускаете запрос.
В этом случае появляется следующее сообщение об ошибке:
Сообщение 8120, уровень 16, состояние 1, строка 3Column "<имя столбца>" недопустимо в списке SELECT, так как он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
Например, вы запускаете следующий запрос:create database testgouse testgocreate table tvt ( v1t binary(1) null)create table tln (ln numeric(5) not null)goselectcase when 1=2 then t1.col1else 10end,casewhen t1.col1 = 2 then t1.col2endfrom (select t2.v1t as col1, 10 as col2 from tvt t2) t1group by case when 1=2 then t1.col1else 10end,casewhen t1.col1 = 2 then t1.col2endgo В запросе оператор "When 1 = 2, T1. Столбец1 else 10" возвращает значение 10. Эта проблема возникает при замене "10" с помощью значения NULL.Примечание.Эта проблема не возникает при удалении одного из операторов case из оператора SELECT или оператора Group By .
Решение
После применения исправления необходимо включить флаг трассировки, чтобы сделать его работоспособным. Если вам нужно применить это исправление, обратитесь в службу поддержки Майкрософт.
Эта проблема впервые устранена в следующем накопительном обновлении SQL Server.
Накопительное обновление 6 для SQL Server 2012 с пакетом обновления 1 (SP1) /en-us/help/2874879
Все новые накопительные обновления для SQL Server содержат все исправления и все исправления для системы безопасности, которые были включены в предыдущий накопительный пакет обновления. Ознакомьтесь с самыми последними накопительными обновлениями для SQL Server.
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".