Динамический порядок SQL Server по - PullRequest
3 голосов
/ 15 апреля 2009

Я пытаюсь использовать динамический порядок в хранимой процедуре, чтобы я мог передать порядок, в котором я хочу, чтобы данные возвращались в хранимую процедуру в качестве параметра. Это прекрасно работает для полей VARCHAR, однако, если я пытаюсь отсортировать поле типа int или datetime, оно выдает следующий код:

DECLARE @ORDERBY INT
SET @ORDERBY = 1
SELECT TOP 10 * FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT
ORDER BY 
CASE 
    WHEN @OrderBy = 1 THEN s10_record_dow
    --WHEN @OrderBy = 2 THEN pk_big_record_id
    else s10_record_dow
END

Если я раскомментирую второй WHEN в выражении case, он ошибается с

«Ошибка преобразования типа данных varchar в bigint.»

Я могу заказать по этому полю нормально, если я не использую оператор case.

Есть идеи?

Ответы [ 3 ]

8 голосов
/ 15 апреля 2009

Измените это на:

SELECT TOP 10 * FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT
ORDER BY 
    CASE WHEN @OrderBy = 1 THEN s10_record_dow ELSE NUll END,  
    CASE WHEN @OrderBy = 2 THEN pk_big_record_id ELSE NULL END,
    CASE WHEN @OrderBy <> 1 AND  @OrderBy <> 2 THEN s10_record_dow 
         ELSE NULL 
    END
3 голосов
/ 26 сентября 2009

Почему бы не использовать ROW_NUMBER ()?

SELECT TOP 10 
       *,
       CASE @SortBy
         WHEN 'A' THEN ROW_NUMBER () OVER (ORDER BY s10_record_dow)
         WHEN 'B' THEN ROW_NUMBER () OVER (ORDER BY pk_id)
       END RowNumber
FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT

Тогда столбцы, по которым вы заказываете, могут быть любого типа.

0 голосов
/ 07 января 2015
order by 
(case when (@orderByAsc = 1) then r.SomeColumn end) asc,
(case when (@orderByAsc = 0) then r.SomeColumn end) desc

вот как вы поднимаетесь или спускаетесь

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