Используйте один оператор case вместо повторения одного и того же оператора case для каждого возможного значения:
SELECT * FROM (
SELECT ROW_NUMBER()
over (
ORDER BY
CASE @SortExpression
WHEN 'Country_id' THEN Country_id
WHEN 'Country_name' THEN Country_name
WHEN 'Country_region' THEN Country_region
WHEN 'Country_area' THEN Country_area
WHEN 'Country_Population' THEN Country_Population
WHEN 'Country_gdp' THEN Country_gdp
END
) as num, * From Country_Profile123
) as tbl
WHERE num BETWEEN @column AND @column1
Применение порядка сортировки немного сложнее. Вы не можете применить направление к значению, поэтому вам понадобится футляр из первых рук и футляр из вторых рук с разными направлениями:
SELECT * FROM (
SELECT ROW_NUMBER()
over (
ORDER BY
CASE @SortExpression
WHEN 'Country_id' THEN Country_id
WHEN 'Country_name' THEN Country_name
WHEN 'Country_region' THEN Country_region
WHEN 'Country_area' THEN Country_area
WHEN 'Country_Population' THEN Country_Population
WHEN 'Country_gdp' THEN Country_gdp
ELSE 0
END,
CASE @SortExpression
WHEN 'Country_id_desc' THEN Country_id
WHEN 'Country_name_desc' THEN Country_name
WHEN 'Country_region_desc' THEN Country_region
WHEN 'Country_area_desc' THEN Country_area
WHEN 'Country_Population_desc' THEN Country_Population
WHEN 'Country_gdp_desc' THEN Country_gdp
ELSE 0
END DESC
) as num, * From Country_Profile123
) as tbl
WHERE num BETWEEN @column AND @column1