Един от начините да направите това е да дефинирате псевдонима на колоната на различно ниво, така че да можете да го препратите два пъти, без да повтаряте израза.
SELECT *,
Row_number() OVER (ORDER BY
CASE WHEN @SortBy LIKE '% ASC' THEN sort_col END ASC,
CASE WHEN @SortBy LIKE '% DESC' THEN sort_col END DESC) AS RowNumber
FROM YourTable
CROSS APPLY (SELECT CASE
WHEN @SortBy LIKE 'column1 %' THEN Cast(column1 AS SQL_VARIANT)
WHEN @SortBy LIKE 'column2 %' THEN Cast(column2 AS SQL_VARIANT)
WHEN @SortBy LIKE 'column3 %' THEN Cast(column3 AS SQL_VARIANT)
WHEN @SortBy LIKE 'column4 %' THEN Cast(column4 AS SQL_VARIANT)
END) C(sort_col)
Все пак бих обмислил използването на динамичен SQL за това. Този вид запитване за улавяне на всички ще убие идеята за получаване на добър план, който може да използва индекси, за да избегне сортиране.