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)