Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Rimozione della duplicazione nell'istruzione dinamica ROW_NUMBER() OVER ORDER BY

Un modo per farlo sarebbe definire l'alias di colonna a un livello diverso in modo da poterlo fare riferimento due volte senza ripetere l'espressione.

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) 

Tuttavia, prenderei in considerazione l'utilizzo di SQL dinamico per questo. Questo tipo di query catch all ucciderà l'idea di ottenere un buon piano in grado di utilizzare gli indici per evitare un ordinamento.