Ordre dynamic par SELECT avec plusieurs colonnes

Quelle est la syntaxe MS SQL correcte pour sélectionner plusieurs colonnes ORDER BY lorsque ORDER BY est basé sur une instruction CASE?

Le ci-dessous fonctionne bien avec des colonnes simples, mais j'ai besoin de sortinger par plusieurs colonnes:

SELECT * FROM Products ORDER BY CASE WHEN @SortIndex = 1 THEN Price END ASC, CASE WHEN @SortIndex = 2 THEN Price DESC, Title ASC END <-- problem line 

Tu pourrais essayer ça

 SELECT * FROM Products ORDER BY CASE WHEN @SortIndex = 1 THEN Price END ASC, CASE WHEN @SortIndex = 2 THEN Price END DESC, CASE WHEN @SortIndex = 2 THEN Title END ASC 

@ Brad. Pavel proposait ce qui suit (je pense),

 DECLARE @query VARCHAR(MAX) SET @query = 'SELECT * FROM Products ORDER BY ' IF (@SortIndex = 1) SET @query =@query + ' Price ASC ' ELSE IF (@SortIndex = 2) SET @query =@query + ' Price DESC, Title ASC ' sp_executesql @query 

Pourquoi pensez-vous que SQL dynamic n'est pas adapté aux procédures stockées complexes? Ce sont exactement les endroits où vous devriez utiliser le SQL dynamic car cela peut aider à réduire la complexité et à résoudre des problèmes tels que le reniflage de parameters. Je suis d'accord que SQL dynamic a ses inconvénients, mais je vous recommand au less d'essayer si cela fonctionne pour vous.

Essayez ceci comme un impact inférieur sur les performances du server – en supposant que vous avez seulement 2 valeurs à @SortIndex (1 et 2). Si non, prolongez votre If avec plus de conditions.

 If @SortIndex = 1 BEGIN SELECT * FROM Products ORDER BY Price ASC END ELSE BEGIN SELECT * FROM Products ORDER BY Price DESC, TITLE ASC END 

Faites ceci … et dites adieu à votre performance. Malheureusement, la meilleure solution consiste à utiliser SQL dynamic.

Vous pourriez réécrire ceci:

 ORDER BY CASE WHEN @SortIndex = 1 THEN Price END ASC, CASE WHEN @SortIndex = 2 THEN Price DESC, Title ASC END 

comme

 CASE WHEN @SortIndex = 1 THEN Price END ASC, CASE WHEN @SortIndex = 2 THEN Price DESC END, Title ASC 

Cela ajoute la colonne de sorting ajoutée à tous les cas, mais dans ma situation, c'est ce que je voulais.

Vous pouvez aussi le faire (juste par exemple):

 CASE WHEN @SortIndex = 1 THEN Price END ASC,Title ASC, CASE WHEN @SortIndex = 2 THEN Price DESC END