SQL Параметризованный порядок сортировки

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть следующий код SQL:

 SELECT 
    *
FROM
    #temp_SuspenseResults
ORDER BY 
    (CASE When @SortBy = 'DueDate' and @SortDir = 0 THEN DueDate END) ASC,
    (CASE When @SortBy = 'DueDate' and @SortDir = 1 THEN DueDate END) DESC,

    (CASE When @SortBy = 'DBAction' and @SortDir = 0 THEN DBAction END) ASC,
    (CASE When @SortBy = 'DBAction' and @SortDir = 1 THEN DBAction END) DESC,  

    (CASE When @SortBy = 'State' and @SortDir = 0 THEN State END) ASC,
    (CASE When @SortBy = 'State' and @SortDir = 1 THEN State END) DESC,

    (CASE When @SortBy = 'FirstName' and @SortDir = 0 THEN FirstName END) ASC,
    (CASE When @SortBy = 'FirstName' and @SortDir = 1 THEN FirstName END) DESC,

    (CASE When @SortBy = 'LastName' and @SortDir = 0 THEN LastName END) ASC,
    (CASE When @SortBy = 'LastName' and @SortDir = 1 THEN LastName END) DESC


OFFSET 
    @PageStart ROWS
FETCH NEXT 
    @PageSize ROWS ONLY;
 

Я получил новое требование, которое мне нужно сортировать по нескольким параметрам. Я знаю, что мы можем упорядочивать по нескольким параметрам, таким как

 Select * from #temp_SuspenseResults order by DueDate, DbAction
 

Но если у меня есть

 Declare @SortBy Varchar(100) = 'DueDate,DbAction'
 

Как мне выполнить сортировку по нескольким значениям, поскольку @SortBy это единственное значение параметра. Любые предложения или идеи будут с благодарностью приняты. Заранее спасибо

Комментарии:

1. Короткий ответ — динамический sql. У вас уже есть один вопрос с примерами. Адаптируйте это для обработки сортировки. Предположительно, вы не учли то же самое изменение в вашем параметре направления?

2. Производительность этого запроса, вероятно, будет довольно низкой, поскольку никакие индексы не могут эффективно использоваться при сортировке (конечно, подкачка, предлагаемая OFFSET /, FETCH NEXT сама по себе является проблемой производительности, если вы просматриваете очень много строк, но это другой вопрос). Я рекомендую прочитать это для получения дополнительной справочной информации о том, как писать эффективные динамические запросы (в нем конкретно рассматриваются параметры для WHERE , но большая часть того же самого применима к ORDER BY предложениям). В конечном итоге вам может даже не понадобиться временная таблица.

Ответ №1:

Я исправил эту проблему, выполнив следующее:

 Declare @SortBy VARCHAR(50) = 'DueDate,DbAction'
Select value into #SortParams from string_split(@SortBy, ',')
SELECT --top 100
        *
FROM
    #temp_SuspenseResults
ORDER BY 
    (CASE When 'DueDate' in (Select value from #SortParams) and @SortDir = 0 THEN DueDate END) ASC,
    (CASE When 'DueDate' in (Select value from #SortParams) and @SortDir = 1 THEN DueDate END) DESC,
    (CASE When 'DBAction' in (Select value from #SortParams) and @SortDir = 0 THEN DBAction END) ASC,
    (CASE When 'DBAction' in (Select value from #SortParams) and @SortDir = 1 THEN DBAction END) DESC,
    (CASE When 'State' in (Select value from #SortParams) and @SortDir = 0 THEN State END) ASC,
    (CASE When 'State' in (Select value from #SortParams) and @SortDir = 1 THEN State END) DESC,
    (CASE When 'FirstName' in (Select value from #SortParams) and @SortDir = 0 THEN FirstName END) ASC,
    (CASE When 'FirstName' in (Select value from #SortParams) and @SortDir = 1 THEN FirstName END) DESC,
    (CASE When 'LastName' in (Select value from #SortParams) and @SortDir = 0 THEN LastName END) ASC,
    (CASE When 'LastName' in (Select value from #SortParams) and @SortDir = 1 THEN LastName END) DESC,
 

Комментарии:

1. Есть ли на самом деле какое-либо значение в выборе нескольких столбцов сортировки, когда порядок столбцов в конечном итоге фиксирован?