dimanche 18 septembre 2011
Si vous avez déjà présenté les résultats d'une requête SQL sous forme de tableau dont l'entête de chaque colonne permettait de trier les données par ordre ascendant ou descendant, vous avez probablement utilisé une ou l'autre de ces techniques :
- construire l'énoncé SQL par concaténation en lui ajoutant dynamiquement le nom du champ avant d'envoyer à l'exécution
- écrire un énoncé SQL qui prend en charge la vérification du tri demandé
Le truc est d'utiliser des CASE WHEN dans la clause ORDER BY où seule une condition sera vraie à l'exécution. Répétez au besoin pour toutes combinaisons que vous souhaitez couvrir. La procédure recevra en paramètre une constante qui permettra de déterminer la colonne et le sens du tri.
Voici un exemple concret sur lequel vous pourrez vous baser :
CREATE PROCEDURE nom_de_la_procedureL'appel à la procédure :
@paramTri VARCHAR(50)
AS
...
-- je n'ai conservé que l'essentiel pour plus de clareté
SELECT *
FROM dbo.inventaire
ORDER BY
CASE WHEN @paramTri = 'NOM_ITEM_ASC' THEN nom_item END ASC,
CASE WHEN @paramTri = 'NOM_ITEM_DESC' THEN nom_item END DESC,
CASE WHEN @paramTri = 'PRIX_ASC' THEN prix END ASC,
CASE WHEN @paramTri = 'PRIX_DESC' THEN prix END DESC,
CASE WHEN @paramTri = 'QUANTITE_EN_STOCK_ASC' THEN quantite_stock END ASC,
CASE WHEN @paramTri = 'QUANTITE_EN_STOCK_DESC' THEN quantite_stock END DESC,
CASE WHEN @paramTri = 'QUANTITE_COMMANDE_ASC' THEN quantite_commande END ASC,
CASE WHEN @paramTri = 'QUANTITE_COMMANDE_DESC' THEN quantite_commande END DESC,
CASE WHEN @paramTri = 'EN_STOCK_DEPUIS_ASC' THEN date_stock END ASC,
CASE WHEN @paramTri = 'EN_STOCK_DEPUIS_DESC' THEN date_stock END DESC,
nom_item ASC -- tri par défaut
EXEC nom_de_la_procedure 'NOM_ITEM_ASC'En écrivant la requête de cette façon plutôt que par concaténation, vous préviendrez aussi les risques d'injection SQL puisque si le libellé reçu par le paramètre n'est pas pris en charge par le CASE WHEN, le tri par défaut sera alors utilisé.