Vous pouvez trier dynamiquement sur plusieurs types en introduisant un multiplier hack au Order by
. La mise en œuvre dépendra de vous être en mesure de convertir chaque champ sortable à un champ entier, comme ceci:
DECLARE @Var1 NVARCHAR(20);
DECLARE @Var2 NVARCHAR(3);
DECLARE @OrderHack INT;
SET @Var1 = 'priority';
SET @Var2 = 'DESC';
IF (@Var2 = 'ASC')
SET @OrderHack = 1;
ELSE
SET @OrderHack = -1;
SELECT *
FROM SortTable
ORDER BY
CASE @var1
WHEN 'priority'
THEN CONVERT(INT, [priority]) * @OrderHack
WHEN 'report_date'
THEN CONVERT(INT, report_date) * @OrderHack
END;
SqlFiddle here
Modifier
Juste pour clarifier les choses, comme par point de @t-clausen.dk
, le piratage dépend d'une conversion vers un type numérique croissant représentant l'ordre. par exemple. Si vous avez besoin d'une résolution plus élevée sur un DATETIME
pour vous assurer que le composant temporel est également pris en compte dans le tri, le INT @OrderHack
peut être remplacé par un FLOAT
ou DECIMAL
etc. Avertissement: L'utilisation de cette technique pour trier les colonnes *CHAR
peut être difficile, surtout si le cas et la sensibilité d'accent est prise en compte.
Êtes-vous prêt à utiliser SQL dynamique? Si ce n'est pas le cas, le seul moyen est d'avoir 4 cas dans votre commande, un pour la colonne et un pour la commande. –
Notant que les colonnes de tri d'OP ne semblent pas être * char - meilleure référence pour les doublons possibles ici: http: //stackoverflow.com/questions/1147763/dynamic-order-direction et http://stackoverflow.com/questions/848340/descending-ascending-parameter-to-a-stored-procedure – StuartLC