Попробуйте:
IF (@TaskId = -1)
SELECT Report.Amount FROM Report
ELSE
SELECT Report.Amount FROM Report WHERE Report.TaskId = @TaskId
Когда @TaskId = -1, конечно, он не будет выполнять поиск по индексу, поскольку будет просто читать все данные.
Обновление:
Прочтите эту прекрасную статью по этому вопросу - динамический поиск является распространенным сценарием.
Вам следует знать о кэшировании плана выполнения, поскольку при переключении с одного набора «необязательных» параметров на другой вы можете столкнуться с плохой производительностью, поэтому вы можете в конечном итоге использовать плохой план выполнения, что приведет к снижению производительности. В этом случае вы хотели бы рассмотреть возможность использования подсказки OPTION (RECOMPILE), чтобы он каждый раз генерировал новый план, который был бы наилучшим планом для этого конкретного набора параметров. Проверьте статью полностью, хотя.