Вместо этого вы перемещаете код 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 по всем строкам, прежде чем вернуть только одну страницу.