2010-07-09 3 views
0

J'ai une page sur mon site qui a plusieurs boîtes déroulantes comme filtres.Réécrire cette requête pour la rendre plus évolutive

Ainsi, la procédure SQL pour cette page serait quelque chose comme ça

IF @Filter1 = 0, @Filter2 = 0, @Filter3 = 0 
    BEGIN 

      SELECT * FROM Table1   

    END 

ELSE IF @Filter1 = 1, @Filter2 = 0, @Filter3 = 0 
    BEGIN 

      SELECT * FROM Table2   

    END 

Au début, il n'y avait que quelques résultats par filtre donc il n'y avait pas beaucoup de permutations. Cependant, plus de filtres ont été ajoutés de sorte qu'il y a plus de 20 contrôles IF ELSE maintenant.

Donc si chaque filtre a 5 options, je devrai faire 5 * 5 * 5 = 125 IF ELSE vérifie si les données sont dépendantes des filtres.

Mise à jour Le premier filtre modifie la condition WHERE, le second filtre ajoute plusieurs tables à l'ensemble des résultats, le troisième filtre modifie la condition ORDER BY

Comment puis-je faire cette requête plus évolutive telle que je vous n'avez pas besoin d'écrire un nouveau groupe d'instructions IF ELSE pour vérifier chaque condition chaque fois qu'un nouveau filtre est ajouté à la liste en plus d'utiliser SQL dynamique ...

+0

Est-ce que vous sélectionnez réellement dans une table différente pour chaque filtre ou la clause WHERE change-t-elle? –

+0

a mis à jour ma question pour refléter votre requête – super9

Répondre

0

Autant que je n'aime pas le SQL dynamique, c'est peut-être le moment. Vous pouvez construire la requête un peu à la fois, puis l'exécuter à la fin.

Si vous n'êtes pas familier, la syntaxe est quelque chose comme:

DECLARE @SQL VARCHAR(1000) 
SELECT @SQL = 'SELECT * FROM ' + 'SOME_TABLE' 
EXEC(@SQL) 

Assurez-vous que vous traitez avec des attaques par injection SQL, un espacement approprié, etc.

Dans ce cas, je ne me Il est préférable de mettre cette logique dans le code de l'application, mais ce n'est pas toujours possible. Si vous utilisez LINQ-to-SQL ou un autre framework LINQ, vous devriez être capable de le faire en toute sécurité, mais cela peut prendre un peu de créativité pour obtenir la construction de la requête LINQ correctement.

+0

Je vois que vous utilisez SELECT pour définir la valeur de @SQL. SET pourrait être utilisé, non? Y a-t-il un avantage à utiliser SELECT? –

+0

À vrai dire, j'aurais probablement utilisé SET, mais je l'ai saisi sur un autre site - j'oublie toujours d'inclure ou non les parens dans l'instruction EXEC, donc je l'ai googlé en premier et je n'ai pas fait attention au SELECT Lorsque vous l'avez entré. –

+0

Vous devez également utiliser sp_executesql pour que toute entrée utilisateur utilisée directement dans l'instruction puisse être transmise à l'instruction en tant que paramètre, ce qui contribue également à éviter les attaques par injection. –

1

Vous devez avoir une table de règles avec des formules peut-être bit à bit et construire une requête qui pourrait brancher des données variables de la table et ajoute à une chaîne pour former le sql et l'utilisation dyna mic sql pour les exécuter.

0

Vous pouvez configurer un ensemble de vues, une pour chaque "filtre", puis sélectionner dans la vue appropriée en fonction du "filtre" sélectionné.

Questions connexes