Je comprends que je peux utiliser des variables dans l'ordre par section des requêtes SQL comme ceci:
order by
case when @var1 = 'priority' then priority end desc,
case when @var2 = 'report_date' then report_date end asc
Mais comment utiliser également les variables pour les sections asc et desc?
sans pour autant Dynamic SQL
chaque option est sa clause par exemple:
ORDER BY
case when @var1 = 'priority asc' THEN priority END ASC ,
case when @var1 = 'priority desc' then priority end DESC,
case when @var2 = 'report_date asc' then report_date end ASC,
case when @var2 = 'report_date desc' then report_date end DESC
Vous pouvez trier dynamiquement sur de nombreux types en introduisant un hack multiplicateur dans le Order by
. L'implémentation dépendra de votre capacité à convertir chaque champ triable en 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;
Modifier
Juste pour clarifier, selon le point de @t-clausen.dk
, Le hack dépend d'une conversion en 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 temps 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
pourrait être difficile, surtout si la sensibilité à la casse et à l'accent est prise en compte.
En supposant que votre variable @var3
magasins 'ASC'
ou 'DESC'
mots-clés, vous pouvez écrire quelque chose comme ceci:
order by
case when @var1 = 'priority' and @var3 = 'DESC' then priority end DESC,
case when @var1 = 'priority' and @var3 = 'ASC' then priority end ASC,
case when @var2 = 'report_date' and @var3 = 'ASC' then report_date end ASC,
case when @var2 = 'report_date' and @var3 = 'DESC' then report_date end DESC
Essaye celui-là -
DECLARE
@column VARCHAR(15) = 'object_id'
, @order CHAR(4) = 'DESC'
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
SELECT *
FROM sys.objects
ORDER BY ' + @column + ' ' + @order
PRINT @SQL
EXEC sys.sp_executesql @SQL