попробовать:
;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 Эрланда Соммарского
охватывает все проблемы и методы попыток написания запросов с несколькими необязательными условиями поиска. Это главное, что вам нужно беспокоиться, это не дублирование кода, а использование индекса. Если ваш запрос не может использовать индекс, он будет плохо сформирован. Существует несколько методов, которые могут использоваться или не разрешать использование индекса.
вот оглавление:
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 Column1=@Search1)
AND (@search2 IS NULL or Column2=@Search2)
AND (@search3 IS NULL or Column3=@Search3)
и оптимизировать его во время выполнения (при условии, что только @ Search2 был передан со значением):
WHERE
Column2=@Search2
и можно использовать индекс (если он определен в столбце 2)