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 [email protected])
AND (@search2 IS NULL or [email protected])
AND (@search3 IS NULL or [email protected])
i zoptymalizować go w czasie wykonywania (pod warunkiem, że tylko @Search2 został przekazany z wartością):
WHERE
[email protected]
i można użyć indeksu (jeśli masz zdefiniowany w kolumnie2)