Динамическое предложение ORDER BY в SQL Server 2008 R2 - PullRequest
2 голосов
/ 23 июня 2010

У нас есть хранимая процедура, в которой мы хотим динамически разрешить пользователю выбирать, по какому столбцу сортировать результат и в каком порядке (по возрастанию / убыванию).В настоящее время у нас есть следующее предложение ORDER BY, но я уверен, что оно может быть оптимизировано.Как?

ORDER BY
    CASE WHEN @OrderBy = 'salvnummer' AND @OrderByDirection = 'DESC' THEN salvnummer END DESC, 
    CASE WHEN @OrderBy = 'salvnummer' AND @OrderByDirection = 'ASC' THEN salvnummer END, --ASC
    CASE WHEN @OrderBy = 'entreprenaddel' AND @OrderByDirection = 'DESC' THEN entreprenaddel END DESC, 
    CASE WHEN @OrderBy = 'entreprenaddel' AND @OrderByDirection = 'ASC' THEN entreprenaddel END, --ASC
    CASE WHEN @OrderBy = 'sektion' AND @OrderByDirection = 'DESC' THEN sektion END DESC, 
    CASE WHEN @OrderBy = 'sektion' AND @OrderByDirection = 'ASC' THEN sektion END, --ASC
    CASE WHEN @OrderBy = 'tid' AND @OrderByDirection = 'DESC' THEN tid END DESC,
    CASE WHEN @OrderBy = 'tid' AND @OrderByDirection = 'ASC' THEN tid END --ASC

Оба входных параметра в настоящее время varchars.

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

Ваш запрос не сможет использовать индекс для выполнения сортировки.Если вы хотите использовать индекс, вам придется построить запрос с использованием динамического SQL, чтобы запрос, выполняющийся в конечном итоге, содержал только предложение ORDER BY для соответствующего столбца. Эта статья объясняет, как вы могли это сделать.SQL может быть создан следующим образом:

'ORDER BY ' + @OrderBy + ' ' + @OrderByDirection

Имейте в виду, что использование динамического SQL увеличивает риск внедрения SQL, поэтому обязательно проверьте свои входные данные.

0 голосов
/ 23 июня 2010

Конечно, вы можете использовать динамический SQL и создать ORDER BY в соответствии с переменными.Однако я не уверен, что это обязательно приведет к более эффективному запросу.Оптимизатор вполне может упростить ваше текущее решение, как только станут доступны значения параметров.

...