Как я могу выполнить запрос для сортировки по столбцу и asc / desc, используя параметры? - PullRequest
2 голосов
/ 28 апреля 2009

Я работаю над этим примером.

http://www.drury.net.nz/2005/04/15/specifying-a-sort-parameter-for-a-tsql-stored-procedure/

CREATE PROCEDURE getEmployees ( @ColumnName varchar(100) ) 
AS 
  SELECT 
    EmployeeID, 
    FirstName, 
    LastName, 
    SSN, 
    Salary 
  FROM 
     Employees 
  ORDER BY 
    CASE 
      WHEN @ColumnName=’LastName’ THEN LastName 
      WHEN @ColumnName=’Salary’ THEN CONVERT(varchar(50), Salary) 
      WHEN @ColumnName=’SSN’ THEN SSN 
    END

Оператор case работает, но что, если у меня есть следующие параметры: @SortColumn, @ SortDirection.

@SortColumn может быть любым столбцом любого типа, и, похоже, используется оператор case, который необходимо преобразовать в один и тот же тип. Я полагаю, что я могу сделать их все VARCHAR и просто убедиться, что значения типа DateTime расположены в правильном порядке для сортировки, как я хочу.

Но что, если у меня параметр @SortDirection установлен как ASC или DESC как значение VARCHAR? Как настроить запрос для изменения направления сортировки?

Ответы [ 5 ]

4 голосов
/ 28 апреля 2009

Если вы не хотите использовать динамический SQL, вы можете сделать это так, используя операторы case, которые приводят к нефильтрованным частям предложения where; Это не будет быстро, хотя. Вы также должны быть осторожны, чтобы типы в ваших разделах дел совпадали.

SELECT
  *
FROM
  dbo.Contacts
ORDER BY
    CASE @Sort
      WHEN 1 THEN Surname
      WHEN 2 THEN Forename
      WHEN 3 THEN Telephone_Number
      ELSE        ''
    END ASC
  , 
    CASE @Sort
      WHEN 4 THEN Personnel_Ref
      WHEN 5 THEN timesheet_number
      WHEN 6 THEN Telephone_Number
      ELSE        ''
    END DESC
1 голос
/ 01 мая 2009

(у меня недостаточно репутации, чтобы комментировать, по-видимому, поэтому я отвечаю здесь)

В ответ на:

Знаете ли вы, как я мог бы избежать использования sp_executesql? Я слышал, что если вы используете что тогда он не может кешировать план запроса. - Бреннан 28 апреля в 0: 16

На самом деле, в большинстве случаев sp_executesql позволяет кэшировать план запроса так же, как и хранимую процедуру.

Хитрость заключается в том, чтобы использовать параметризованный динамический sql, например:

exec sp_executesql N'select from MyTable where myId = @id', N'@id int', @id;

Таким образом, вы выполняете тот же запрос, просто подставляя в @id, как в случае с хранимой процедурой. В динамическом sql план запроса кэшируется на основе строкового значения запроса (первый параметр sp_executesql).

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

Однако, поскольку выражение и направление сортировки НЕ могут быть параметризованы (они должны быть объединены прямо в строку запроса), вы получите отдельный план запроса, кэшированный для каждого выражения и направления сортировки. Это, вероятно, не имеет большого значения.

EDIT: Вот ссылка, объясняющая, как планы динамического SQL-запроса кэшируются .

0 голосов
/ 28 апреля 2009

Я думаю, что ваш сценарий будет выглядеть так:

Если у вас есть

@SortColumn varchar(50), @SortDirection varchar(50)

тогда вы можете сделать это:

DECLARE @sql nvarchar(4000)    
SET @sql = N'SELECT EmployeeID, FirstName, LastName, SSN, Salary ' +
            'FROM Employees ' +
            'ORDER BY ' + @SortColumn + ' ' + @SortDirection    
EXEC sp_executesql @sql

Конечно, вы можете поместить в хранимую процедуру или что угодно.

0 голосов
/ 28 апреля 2009

Поместите результат оператора select для таблицы Employee в переменную таблицы или во временную таблицу.

Затем используйте оператор if..else для возврата результата в порядке возрастания / убывания.

В использовании if..else.

нет ничего плохого
0 голосов
/ 28 апреля 2009

Вы можете использовать динамические запросы.

Например, посмотрите здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...