Любопытное несогласованное поведение SQL Server в предложениях оконных функций?

Задавая другой вопрос , я обнаружил, что SQL Server (происходит как в 2005, так и в 2008 году), похоже, ведет себя странно и непоследовательно при работе с Операторы CASE в разделах оконных функций. Следующий код дает ошибку:

declare @t table (SortColumn int)
insert @t values (1), (2), (3)
declare @asc bit
set @asc = 0

select  row_number() over (order by
            case when 1=1 then SortColumn end asc,
            case when 1=0 then SortColumn end desc) RowNumber
,       *
from    @t

Ошибка Оконные функции не поддерживают константы как выражения предложения ORDER BY. Я предполагаю, что это связано с тем, что оператор case может оценивать значение NULL , которое является константой. Как и следовало ожидать, этот код дает ту же ошибку:

declare @t table (SortColumn int)
insert @t values (1), (2), (3)
declare @asc bit
set @asc = 0

select  row_number() over (order by
            NULL asc,
            NULL desc) RowNumber
,       *
from    @t

... предположительно по той же причине. Однако этот код не выдает ошибки:

declare @t table (SortColumn int)
insert @t values (1), (2), (3)
declare @asc bit
set @asc = 0

select  row_number() over (order by
            case when @asc=1 then SortColumn end asc,
            case when @asc=0 then SortColumn end desc) RowNumber
,       *
from    @t

Единственное отличие здесь от первого кодового блока состоит в том, что я переместил один из условных операндов операторов case в переменную, @asc . Теперь это нормально работает. Но почему? Операторы case могут по-прежнему оцениваться как NULL , что является константой, поэтому это не должно работать ... но работает. Это как-то согласованно, или это особый случай поведения, установленного Microsoft?

Все это поведение можно проверить, поиграв с этим запросом .


Обновление: Это ограничение не соответствует ' t применимо только к предложениям OVER (хотя они дают другую ошибку) - это применимо ко всем предложениям ORDER BY , начиная с SQL Server 2005. Вот запрос , который также показано ограничение с помощью обычного предложения SELECT ORDER BY .

7
задан Community 23 May 2017 в 11:58
поделиться