Puis-je stocker l'ordre de sorting SQL Server dans une variable?

J'ai le SQL suivant dans une procédure stockée. Existe-t-il un moyen de supprimer l'instruction IF et de passer l'option 'ASC' / 'DESC' en tant que variable?

Je sais que je pourrais faire la requête de plusieurs façons, ou returnner une table et la sortinger de l'extérieur, etc. J'aimerais juste savoir si je peux éviter de dupliquer l'instruction CASE.

IF @sortOrder = 'Desc' BEGIN SELECT * FROM #t_results ORDER BY CASE WHEN @OrderBy = 'surname' THEN surname END DESC, CASE WHEN @OrderBy = 'forename' THEN forename END DESC, CASE WHEN @OrderBy = 'fullName' THEN fullName END DESC, CASE WHEN @OrderBy = 'userId' THEN userId END DESC, CASE WHEN @OrderBy = 'MobileNumber' THEN MSISDN END DESC, CASE WHEN @OrderBy = 'DeviceStatus' THEN DeviceStatus END DESC, CASE WHEN @OrderBy = 'LastPosition' THEN LastPosition END DESC, CASE WHEN @OrderBy = 'LastAlert' THEN LastAlert END DESC, CASE WHEN @OrderBy = 'LastCommunication' THEN LastCommunication END DESC, CASE WHEN @OrderBy = 'LastPreAlert' THEN LastPreAlert END DESC END ELSE BEGIN SELECT * FROM #t_results ORDER BY CASE WHEN @OrderBy = 'surname' THEN surname END DESC, CASE WHEN @OrderBy = 'forename' THEN forename END DESC, CASE WHEN @OrderBy = 'fullName' THEN fullName END DESC, CASE WHEN @OrderBy = 'userId' THEN userId END DESC, CASE WHEN @OrderBy = 'MobileNumber' THEN MSISDN END DESC, CASE WHEN @OrderBy = 'DeviceStatus' THEN DeviceStatus END DESC, CASE WHEN @OrderBy = 'LastPosition' THEN LastPosition END DESC, CASE WHEN @OrderBy = 'LastAlert' THEN LastAlert END DESC, CASE WHEN @OrderBy = 'LastCommunication' THEN LastCommunication END DESC, CASE WHEN @OrderBy = 'LastPreAlert' THEN LastPreAlert END DESC END END 

passer dans @OrderBy int, où positif est ASC, négatif est DESC, nombre réel est la colonne à sortinger par

 SELECT dt.yourColumn1 ,dt.yourColumn2 ,dt.yourColumn3 ,CASE WHEN @OrderBy>0 THEN dt.SortBy ELSE NULL END AS SortByAsc ,CASE WHEN @OrderBy<0 THEN dt.SortBy ELSE NULL END AS SortByDesc FROM (SELECT yourColumn1 ,yourColumn2 ,yourColumn3 ,CASE WHEN ABS(@OrderBy) = 1 THEN surname WHEN ABS(@OrderBy) = 2 THEN forename WHEN ABS(@OrderBy) = 3 THEN fullName WHEN ABS(@OrderBy) = 4 THEN CONVERT(varchar(10),userId) WHEN ABS(@OrderBy) = 5 THEN CONVERT(varchar(10),MobileNumber WHEN ABS(@OrderBy) = 6 THEN DeviceStatus WHEN ABS(@OrderBy) = 7 THEN LastPosition WHEN ABS(@OrderBy) = 8 THEN CONVERT(varchar(23),LastAlert,121) WHEN ABS(@OrderBy) = 9 THEN CONVERT(varchar(23),LastCommunication,121) WHEN ABS(@OrderBy) =10 THEN CONVERT(varchar(23),LastPreAlert,121) ELSE NULL END AS SortBy FROM YourTablesHere WHERE X=Y ) dt ORDER BY SortByAsc ASC, SortByDesc DESC 

Assurez-vous simplement de créer une string qui sortinge correctement, notez que j'ai utilisé 'AAAA-MM-JJ hh: mm: ss.mmm' pour les dates et que j'ai mis les nombres dans les strings. Nous mettons généralement plusieurs colonnes set, donc si vous faites un sorting par nom de famille, le prénom est utilisé aussi, etc. Attention, si vous combinez plusieurs colonnes, vous devrez remplir des zéros ou des espaces.

Si vous ne voulez pas que les colonnes SortByAsc et SortByDesc soient dans le jeu de résultats, placez le tout dans une table dérivée.

Vous pouvez le faire sans SQL dynamic …

 SELECT * FROM My_Table WHERE Whatever = @something ORDER BY CASE @sort_order WHEN 'ASC' THEN CASE @order_by WHEN 'surname' THEN surname WHEN 'forename' THEN forename WHEN 'fullname' THEN fullname ELSE surname END ELSE '1' END ASC, CASE @sort_order WHEN 'DESC' THEN CASE @order_by WHEN 'surname' THEN surname WHEN 'forename' THEN forename WHEN 'fullname' THEN fullname ELSE surname END ELSE '1' END DESC 

Oui, mais vous devez utiliser des requêtes dynamics.

Jetez un coup d'oeil ici .

Que dis-tu de ça:

 CASE WHEN @order_by = @order_by THEN @order_by END 

Ensuite, il n'y a aucune raison d'avoir plusieurs cas.