ORDER By CASE тормозит запрос

Есть запрос вида:

SELECT TOP(@RecordCount) 
...
CASE WHEN @OrderBy = 0 THEN [TransactionDateTime] END,
CASE WHEN @OrderBy = 1 THEN [TransactionDateTime] END DESC
CASE WHEN @OrderBy = 2 THEN c.[Name] END,
CASE WHEN @OrderBy = 3 THEN c.[Name] END DESC

Он выполняется маскимально долго, ибо независимо от @RecordCount, обходит ВСЕ записи таблицы. Стоит мне убрать CASE в ORDER BY - запрос выполняется почти моментально. Как обойти это, сохранив возможность гибкой сортировки? Я вижу пока единственный вариант - формировать текст запроса динамически, с жестко заданной сортировкой. Сейчас это - хранимая процедура. Но неужели нет других способов? Сейчас вся бизнес-логика прописана в хранимых процедурах, не хотелось бы от этого отступать. Спасибо!


Ответы (1 шт):

Автор решения: Alpensin

Можно собрать запрос таким образом. Тогда в самом запросе не будет лишних вычислений.

DECLARE @OrderBy INTEGER
DECLARE @QUERY VARCHAR(1000)
DECLARE @ORDERING VARCHAR(255)
SET @QUERY = 'SELECT 1 [TransactionDateTime], ''a'' [Name] UNION ALL SELECT 2 [TransactionDateTime], ''b'' [Name]'

SET @OrderBy = 1

IF (@OrderBy = 0) SET @ORDERING = ' ORDER BY [TransactionDateTime] ASC'
ELSE IF (@OrderBy = 1) SET @ORDERING = ' ORDER BY [TransactionDateTime] DESC'
ELSE IF(@OrderBy = 2)  SET @ORDERING = ' ORDER BY [Name] ASC'
ELSE SET @ORDERING = ' ORDER BY [Name] DESC'
    
SET @QUERY = @QUERY + @ORDERING
EXEC (@QUERY)
→ Ссылка