2012-05-09 2 views
1

Я хочу динамически установить порядок заказа. Я попробовал это, используя case.Как установить порядок динамически в SQL Server?

Но после нескольких случаев он не работает для меня, и я не понимаю, почему это происходит. Я пробовал следующую ссылку http://www.sqlteam.com/article/dynamic-order-by, это работает только для 5-6 случаев, после чего я получаю ошибки преобразования.

ORDER BY CASE WHEN @OrderBY = 1 THEN Pla_BattingAverage 
      WHEN @OrderBY = 2 THEN Pla_HomeRuns 
      WHEN @OrderBY = 3 THEN Pla_RBIs 
      WHEN @OrderBY = 4 THEN Pla_StolenBases 
      END DESC 
+0

Можете ли вы отправить точное сообщение об ошибке и запрос, который дает эту ошибку? –

+0

Нужно ввести код, задающий @OrderBY, т. Е. Полный запрос. – Paul

ответ

1

Вы не можете, например, перемешать строки и целые числа в результатах выражения case.

Вы могли бы попробовать что-то вроде этого, вместо:

ORDER BY CASE WHEN @OrderBY = 1 THEN Pla_BattingAverage END DESC, 
     CASE WHEN @OrderBY = 2 THEN Pla_HomeRuns END DESC, 
     CASE WHEN @OrderBY = 3 THEN Pla_RBIs END DESC, 
     CASE WHEN @OrderBY = 4 THEN Pla_StolenBases END DESC 

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

0

Один из solution был предложен Mark Byers.

Вы также можете использовать ROW_NUMBER() и отсортировать по результату ROW_NUMBER() функция (по-прежнему одна ROW_NUMBER() для каждого типа заказа).

Другой, чтобы сохранить результат первого запроса (предположим, что нет TOP) во временной таблице, а затем используйте IF для возврата результата.

Что-то вроде:

INSERT INTO #results 
SELECT 
    a, b, c 
FROM 
    table 
... 

IF @OrderBY = 1 THEN 
    SELECT * FROM #results ORDER BY Pla_BattingAverage DESC 
END 

IF @OrderBY = 2 THEN 
    SELECT * FROM #results ORDER BY Pla_HomeRuns DESC 
END 

... 

Однако если производительность имеет значение, я бы попытаться генерировать запрос динамически.

Смежные вопросы