Порядок условной сортировки в предложениях оконных функций SQL Server

Итак, это не обычный вопрос "условной сортировки по" ... У меня здесь довольно сложная проблема. :-) Я хочу, чтобы моя хранимая процедура предлагала условный порядок сортировки результатов. Обычно это можно сделать следующим образом:

SELECT *
INTO #ResultsBeforeSubset
FROM
    MyTable
ORDER BY
    CASE WHEN @SortAscending=1 THEN 'SortColumn' END ASC,
    CASE WHEN @SortAscending=0 THEN 'SortColumn' END DESC

Я хотел бы сделать оператор CASE вокруг фактического ASC / DESC , но это не не работает. Причина, по которой вышеуказанный метод работает, заключается в том, что, когда @SortAscending не равно заданному значению, SQL-сервер переводит оператор CASE в константу NULL . Итак, если @SortAscending равно 0, у вас фактически есть:

ORDER BY
    NULL ASC,
    SortColumn DESC

Тогда первое выражение сортировки просто ничего не делает. Это работает, потому что в обычном операторе SELECT вы можете использовать константу в предложении ORDER BY .

Проблема в том, что время, которое я сортирую в моей хранимой процедуре, приходится на Оператор SELECT , содержащий оконную функцию ROW_NUMBER () . Поэтому я хочу поместить оператор CASE в его предложение OVER , например:

SELECT *
INTO #ResultsBeforeSubset
FROM (
    SELECT
        ROW_NUMBER() OVER (
            ORDER BY
                CASE WHEN @SortAscending=1 THEN rowValues.[SortColumn] END ASC,
                CASE WHEN @SortAscending=0 THEN rowValues.[SortColumn] END DESC
        ) AS RowNumber,
        *
    FROM (
        -- UNIONed SELECTs returning rows go here...
    ) rowValues
) rowValuesWithRowNum

К сожалению, это вызывает следующую ошибку при запуске хранимой процедуры:

Windowed functions do not support constants as ORDER BY clause expressions.

Потому что это является предложением оконной функции, преобразование оператора CASE в константу NULL недопустимо.

Может ли кто-нибудь придумать способ, которым я могу условно изменить порядок сортировки из UNION ed SELECT s и присвоить номера строк каждой строке, полученной в результате этих отсортированных результатов? Я знаю, что могу прибегнуть к построению всего запроса в виде строки и выполнить его как полностью динамический SQL, но я бы предпочел избежать этого, если возможно.


UPDATE: Похоже, проблема не была вызвана Оператор CASE как таковой , но потому, что я использовал только постоянные значения в условном предложении оператора CASE . Я задал новый вопрос об этом любопытном поведении здесь .

6
задан Community 23 May 2017 в 12:01
поделиться