essayez ceci:
SELECT * FROM table
WHERE (@param='??' AND id IN (1,2,4,5,8))
OR (@param!='??' AND id in (9,7,3))
cela aura un problème à l'aide d'un index. La clé avec des conditions de recherche dynamiques est de s'assurer qu'un index est utilisé, au lieu de comment je peux facilement réutiliser le code, éliminer les duplications dans une requête, ou essayer de tout faire avec la même requête. Voici un article très complet sur la façon de traiter ce sujet:
Dynamic Search Conditions in T-SQL by Erland Sommarskog
Il couvre toutes les questions et les méthodes d'essayer d'écrire des requêtes avec plusieurs conditions de recherche en option. Ce n'est pas la duplication de code, mais l'utilisation d'un index. Si votre requête ne parvient pas à utiliser un index, il se produira mal. Il existe plusieurs techniques qui peuvent ou non permettre l'utilisation d'un index.
voici la table des matières:
Introduction
The Case Study: Searching Orders
The Northgale Database
Dynamic SQL
Introduction
Using sp_executesql
Using the CLR
Using EXEC()
When Caching Is Not Really What You Want
Static SQL
Introduction
x = @x OR @x IS NULL
Using IF statements
Umachandar's Bag of Tricks
Using Temp Tables
x = @x AND @x IS NOT NULL
Handling Complex Conditions
Hybrid Solutions – Using both Static and Dynamic SQL
Using Views
Using Inline Table Functions
Conclusion
Feedback and Acknowledgements
Revision History
si vous êtes sur la bonne version de SQL Server 2008, il y a une technique supplémentaire qui peut être utilisé, voir: Dynamic Search Conditions in T-SQL Version for SQL 2008 (SP1 CU5 and later)
Si vous êtes sur cette version correcte de SQL Server 2008, vous pouvez simplement ajouter OPTION (RECOMPILE)
à la requête et la valeur de la variable locale au moment de l'exécution est utilisée pour les optimisations.
Considérez ceci, OPTION (RECOMPILE)
prendra ce code (où aucun indice peut être utilisé avec ce gâchis de OR
s):
WHERE
(@search1 IS NULL or [email protected])
AND (@search2 IS NULL or [email protected])
AND (@search3 IS NULL or [email protected])
et optimiser au moment de l'exécution à (à condition que seul @ Search2 a été adoptée avec une valeur):
WHERE
[email protected]
et un index peut être utilisé (si vous en avez défini sur Colonne2)
+1 Bonnes ressources – NotMe