Search code examples
sqlsql-serverstored-proceduressql-order-bycase

Dynamic order direction


I writing a SP that accepts as parameters column to sort and direction.

I don't want to use dynamic SQL.

The problem is with setting the direction parameter.

This is the partial code:

SET @OrderByColumn = 'AddedDate'
SET @OrderDirection = 1;

…

ORDER BY 
    CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
        WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
        WHEN @OrderByColumn = 'AddedBy' THEN AddedBy
        WHEN @OrderByColumn = 'Title' THEN Title    
    END

Solution

  • You could have two near-identical ORDER BY items, one ASC and one DESC, and extend your CASE statement to make one or other of them always equal a single value:

    ORDER BY
          CASE WHEN @OrderDirection = 0 THEN 1
          ELSE
               CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
                    WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
                    WHEN @OrderByColumn = 'AddedBy' THEN AddedBy
                    WHEN @OrderByColumn = 'Title' THEN Title
               END
          END ASC,
          CASE WHEN @OrderDirection = 1 THEN 1
          ELSE
               CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
                    WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
                    WHEN @OrderByColumn = 'AddedBy' THEN AddedBy           
                    WHEN @OrderByColumn = 'Title' THEN Title
               END
          END DESC