It looks like you need CAST() and CONVERT() elements in CASE to make it work:
Declare @SortColumn varchar(10) DECLARE @SortExpression varchar (10) SET @SortColumn = 'DOB' SET @SortExpression = 'DESC' -- Need to sort in both ASC and DESC Select Name, DOB, Rate, ROW_NUMBER() OVER (ORDER BY CASE WHEN @SortColumn = 'Name' then Name WHEN @SortColumn = 'DOB' THEN convert(char(10), DOB, 120) WHEN @SortColumn = 'Rate' THEN Cast(Rate as varchar(10)) END ASC ) AS RowNumberASC, ROW_NUMBER() OVER (ORDER BY CASE WHEN @SortColumn = 'Name' then Name WHEN @SortColumn = 'DOB' THEN convert(char(10), DOB, 120) WHEN @SortColumn = 'Rate' THEN Cast(Rate as varchar(10)) END DESC ) AS RowNumberDESC FROM Table1
See SQL Fiddle with Demo
As @Martin, ASC , DESC noted cannot be parameterized.
Taryn source share