Если вы не можете рассмотреть динамический SQL, попробуйте использовать как можно меньше функций и подделку данных. Наиболее распространенным подходом для этого будет что-то вроде следующего:
DECLARE @OptionalFilter1 INT
DECLARE @OptionalFilter2 VARCHAR(100)
-- ...
DECLARE @OptionalFilterN BIT
SELECT
YourColumns
FROM
YourTable AS T
WHERE
(@OptionalFilter1 IS NULL OR @OptionalFilter1 = T.Filter1Column) AND
(@OptionalFilter2 IS NULL OR @OptionalFilter2 = T.Filter2Column) AND
-- ...
(@OptionalFilterN IS NULL OR @OptionalFilterN = T.FilterNColumn)
Для вашего примера будет:
DECLARE @EventName VARCHAR(100) = 'Coffee in Coffee Bean'
SELECT
*
FROM
EventDetails AS E
WHERE
(@EventName IS NULL OR E.Event LIKE '%' + @EventName + '%')
Если это закончится процедурой, рассмотрите возможность использования OPTION (RECOMPILE)
в запросе со многими фильтрами и / или присваивание параметров хранимой процедуры новым переменным локальной области видимости, чтобы предотвратить перехват параметров. Вы можете прочитать о проблеме перехвата параметров (с примером, подобным вашему) в этом посте .