Sie können dynamisch nach vielen Typen sortieren, indem Sie multiplier hack in die Order by
eingeben. Die Umsetzung hängt von Ihnen jedes sortierbar Feld zu einem Integer-Feld wie so zu konvertieren, in der Lage:
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
bearbeitet
Nur um zu klären, wie pro @t-clausen.dk
‚s Punkt , der Hack ist abhängig von einer Umwandlung zurück in einen zunehmenden numerischen Typ, der die Reihenfolge repräsentiert. z.B. Wenn Sie eine höhere Auflösung auf DATETIME
benötigen, um sicherzustellen, dass die Zeitkomponente auch in der Sortierung berücksichtigt wird, kann die INT @OrderHack
durch eine FLOAT
oder DECIMAL
usw. ersetzt werden. Vorbehalt: Die Verwendung dieser Technik zum Sortieren nach *CHAR
Spalten kann eine Herausforderung darstellen, besonders wenn und Akzentempfindlichkeit wird berücksichtigt.
Sind Sie bereit, dynamisches SQL zu verwenden? Wenn nicht, dann ist der einzige Weg, 4 Fälle in Ihrer Bestellung zu haben, einen für die Spalte und einen für die Bestellung. –
Beachten Sie, dass die Sortierspalten von OP nicht * char sind - bessere Referenz für mögliche Duplikate hier: http: //stackoverflow.com/questions/1147763/dynamic-order-direction und http://stackoverflow.com/questions/848340/absteigend-aufsteigend-Parameter-zu-gespeichert-Prozedur – StuartLC