spróbuj:
;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
)
kluczem z dynamicznym warunkiem wyszukiwania jest upewnienie się, że używany jest indeks. Oto bardzo obszerny artykuł o tym, jak poradzić sobie z tym tematem:
Warunki dynamicznego wyszukiwania w T-SQL autorstwa Erlanda Sommarskog
obejmuje wszystkie problemy i metody prób pisania zapytań z wieloma opcjonalnymi warunkami wyszukiwania. Najważniejszą rzeczą, o którą musisz się martwić, nie jest powielanie kodu, ale użycie indeksu. Jeśli Twoje zapytanie nie użyje indeksu, będzie ono źle wykonywane. Istnieje kilka technik, których można użyć, które mogą lub nie pozwalają na użycie indeksu.
oto spis treści:
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 jeśli korzystasz z odpowiedniej wersji SQL Server 2008, możesz skorzystać z dodatkowej techniki, zobacz:Warunki wyszukiwania dynamicznego w wersji T-SQL dla SQL 2008 (SP1 CU5 i nowsze)
Jeśli korzystasz z odpowiedniej wersji SQL Server 2008, możesz po prostu dodać OPTION (RECOMPILE) do zapytania, a wartość zmiennej lokalnej w czasie wykonywania jest używana do optymalizacji.
Rozważ to, OPTION (RECOMPILE) przyjmie ten kod (gdzie żaden indeks nie może być użyty z tym bałaganem 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)
i zoptymalizować go w czasie wykonywania (pod warunkiem, że tylko @Search2 został przekazany z wartością):
WHERE
example@sqldat.com
i można użyć indeksu (jeśli masz zdefiniowany w kolumnie2)