Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Ordre En utilisant un paramètre pour le nom de la colonne

Vous devriez pouvoir faire quelque chose comme ceci :

SELECT *
FROM
    TableName
WHERE
    (Forename LIKE '%' + @SearchValue + '%') OR
    (Surname LIKE '%' + @SearchValue + '%') OR
    (@SearchValue = 'ALL')
ORDER BY 
    CASE @OrderByColumn
    WHEN 1 THEN Forename
    WHEN 2 THEN Surname
    END;
  • Attribuez 1 à @OrderByColumn trier sur Forename .
  • Attribuez 2 pour trier sur Surname .
  • Etc... vous pouvez étendre ce schéma à un nombre arbitraire de colonnes.

Attention tout de même aux performances. Ces types de constructions peuvent interférer avec la capacité de l'optimiseur de requête à trouver un plan d'exécution optimal. Par exemple, même si Forename est couvert par l'index, la requête peut toujours nécessiter le tri complet au lieu de simplement parcourir l'index dans l'ordre.

Si tel est le cas, et que vous ne pouvez pas vivre avec les implications en termes de performances, il peut être nécessaire d'avoir une version distincte de la requête pour chaque ordre de tri possible, ce qui complique considérablement les choses côté client.