È possibile ordinare dinamicamente su molti tipi introducendo un multiplier hack su Order by
. L'implementazione dipenderà da voi di essere in grado di convertire ogni campo ordinabile ad un campo intero, in questo modo:
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
Modifica
solo per chiarire, come da @t-clausen.dk
s' punto , l'hack dipende da una conversione in un tipo numerico crescente che rappresenta l'ordine. per esempio. se è necessaria una risoluzione più elevata su unper garantire che il componente orario sia considerato nell'ordinamento, lo INT @OrderHack
può essere sostituito con un FLOAT
o DECIMAL
. Avvertenza: l'utilizzo di questa tecnica per ordinare le colonne *CHAR
potrebbe essere difficile, soprattutto nel caso e la sensibilità di accento è presa in considerazione.
Sei disposto a utilizzare SQL dinamico? In caso contrario, l'unico modo sarà quello di avere 4 casi nel tuo ordine, uno per la colonna e uno per l'ordine. –
Notando che le colonne di ordinamento dell'OP non sembrano essere * char - migliore riferimento per possibili duplicati qui: http: //stackoverflow.com/questions/1147763/dynamic-order-direction e http://stackoverflow.com/questions/848340/discendente-ascendente-parametro-a-uno-stored-procedure – StuartLC