Думаю понимаю, почему вы хотите это изменить. Всеми этими блоками if-else становится трудно управлять, особенно если позже вы захотите изменить процедуру для фильтрации по нескольким параметрам, а не только по одному параметру. Количество условных запросов резко возрастает.
Там - это способ сделать это с помощью одного оператора. Это шаблон «необязательный параметр». Это выглядит так:
select ...
from dbo.MPlanner mp
where (@wave is null or mp.MigrationWave = @wave)
and (@OwnerWWID is null or mpOwnerWWID like @ownerWWID + '%')
and (@OwnerEmailId is null or ...)
option (recompile);
Шаблон должен быть четким: если параметр не имеет значения, игнорируйте его. В противном случае используйте его для фильтрации.
Имейте в виду, что хотя это может быть огромной оптимизацией с точки зрения объема кода, на самом деле это может быть деоптимизация с точки зрения производительности. option (recompile)
критичен. Без него SQL сгенерирует план, основанный на первом запуске процедуры, но, очевидно, план для использования в такой ситуации полностью зависит от того, какие параметры установлены.
Параметр перекомпиляции сообщает SQL: «Эй, каждый раз, когда вы запускаете этот оператор, придумайте хороший план на основе значений переменных, которые вы видите на этот раз ». Итак, если @wave
(например) имеет значение NULL для некоторого выполнения c, SQL может просто замкнуть этот предикат полностью. Если вы заполните только один параметр значением not null
, фактически будет проверено только это условие.