SQL Server Paging, с динамическим упорядочением? - PullRequest
2 голосов
/ 23 февраля 2011

Я нашел хороший пример подкачки в SQL Server, однако мне нужно выполнить динамическое упорядочение. То есть пользователь передает целое число, которое затем используется для упорядочения, например:

ORDER BY
    CASE WHEN @orderBy = 1 THEN DateDiff(ss, getdate(), received_date)  --oldest
        WHEN @orderBy = 2 THEN DateDiff(ss, received_date, getdate()) --newest
        WHEN @orderBy = 3 THEN message_id --messageid
        WHEN @orderBy = 4 THEN LEFT(person_reference, LEN(person_reference)-1) --personid
    END

Можно ли делать пейджинг с помощью этой формы динамического упорядочения?

1 Ответ

4 голосов
/ 23 февраля 2011

Вместо этого вы перемещаете код ORDER BY в оконную функцию ROW_NUMBER.

Как в этом примере

SELECT * -- your columns
FROM
(
    SELECT *, ROWNUM = ROW_NUMBER() OVER (
    ORDER BY
        CASE WHEN @orderBy = 1 THEN DateDiff(ss, getdate(), received_date)  --oldest
            WHEN @orderBy = 2 THEN DateDiff(ss, received_date, getdate()) --newest
            WHEN @orderBy = 3 THEN message_id --messageid
            WHEN @orderBy = 4 THEN LEFT(person_reference, LEN(person_reference)-1) --personid
        END
    )
    FROM TBL

) R
where ROWNUM between ((@pageNumber-1)*@PageSize +1) and (@pageNumber*@PageSize)

Основная проблема со сложным ORDER BY и оконной функцией заключается в том, что вы полностью материализуете rownum по всем строкам, прежде чем вернуть только одну страницу.

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