опитайте:
;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
)
ключът при условието за динамично търсене е да се уверите, че се използва индекс. Ето една много изчерпателна статия за това как да се справите с тази тема:
Условия за динамично търсене в T-SQL от Erland Sommarskog
той обхваща всички проблеми и методи за опити за писане на заявки с множество незадължителни условия за търсене. Това основно нещо, с което трябва да се интересувате, не е дублирането на код, а използването на индекс. Ако вашата заявка не успее да използва индекс, тя ще се формира лошо. Има няколко техники, които могат да се използват, които могат или не могат да позволят използването на индекс.
ето съдържанието:
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 ако използвате правилната версия на SQL Server 2008, има допълнителна техника, която може да се използва, вижте:Условия за динамично търсене във версия на T-SQL за SQL 2008 (SP1 CU5 и по-нови)
Ако използвате правилната версия на SQL Server 2008, можете просто да добавите OPTION (RECOMPILE) към заявката и стойността на локалната променлива по време на изпълнение се използва за оптимизациите.
Помислете за това, OPTION (RECOMPILE) ще вземе този код (където не може да се използва индекс с тази бъркотия от OR s):
WHERE
(@search1 IS NULL or example@sqldat.com)
AND (@search2 IS NULL or example@sqldat.com)
AND (@search3 IS NULL or example@sqldat.com)
и го оптимизирайте по време на изпълнение да бъде (при условие, че само @Search2 е предадено със стойност):
WHERE
example@sqldat.com
и може да се използва индекс (ако имате дефиниран такъв в Колона2)