prøv:
;with CTE_AorB
(
select * from table_A WHERE (condition true)
union all
select * from table_B WHERE NOT (condition true)
),
CTE_C as
(
select * from CTE_AorB // processing is removed
)
Nøglen med en dynamisk søgebetingelse er at sikre, at et indeks bruges. Her er en meget omfattende artikel om, hvordan man håndterer dette emne:
Dynamiske søgebetingelser i T-SQL af Erland Sommarskog
den dækker alle problemer og metoder til at forsøge at skrive forespørgsler med flere valgfrie søgebetingelser. Denne vigtigste ting, du skal være bekymret for, er ikke duplikeringen af kode, men brugen af et indeks. Hvis din forespørgsel ikke bruger et indeks, vil den præforme dårligt. Der er flere teknikker, der kan bruges, som måske eller måske ikke gør det muligt at bruge et indeks.
her er indholdsfortegnelsen:
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
hvis du er på den korrekte version af SQL Server 2008, er der en yderligere teknik, der kan bruges, se:Dynamiske søgebetingelser i T-SQL-version til SQL 2008 (SP1 CU5 og nyere)
Hvis du er på den rigtige udgivelse af SQL Server 2008, kan du bare tilføje OPTION (RECOMPILE)
til forespørgslen, og den lokale variabels værdi ved kørsel bruges til optimeringerne.
Overvej dette, OPTION (RECOMPILE)
vil tage denne kode (hvor intet indeks kan bruges med denne rod af OR
s):
WHERE
(@search1 IS NULL or [email protected])
AND (@search2 IS NULL or [email protected])
AND (@search3 IS NULL or [email protected])
og optimer det på kørselstidspunktet (forudsat at kun @Search2 blev sendt ind med en værdi):
WHERE
[email protected]
og et indeks kan bruges (hvis du har et defineret på Kolonne2)