Вы можете передать необязательные параметры хранимой процедуре, но оптимизатор создаст план, основываясь на конкретных вызовах, которые вы делаете этому процессу. В SQL Server 2005 и более поздних версиях есть некоторые приемы, позволяющие избежать этого (сниффинг параметров, подсказки «без компиляции» и т. Д.)
Несмотря на это, я предпочитаю создавать представление с ядром запроса, а затем использовать это представление в нескольких процессах с конкретными параметрами. Это позволяет SQL оптимизировать так, как он хочет / должен, и я все еще могу консолидировать особенности запроса.