Вместо того, чтобы использовать -1, чтобы показать, что вы не знаете или не заботитесь, как насчет использования Null для этого? Практически для чего это было сделано. Тогда вы могли бы переключиться на бит, а не Int.
Кроме того, я уверен, что TomTom не согласится, но я думаю, что использование оператора CASE является подходящим способом для этого.
Ваш пробег может варьироваться, но кажется, что механизм запросов обрабатывает его намного лучше, чем упаковывать вещи в IsNull или иметь несколько операторов OR, что может стать довольно грязным, когда вы начнете добавлять другие условия.
Независимо от того, каким путем вы идете, план выполнения будет немного страдать в зависимости от того, что вы передаете, но он не должен быть СЛИШКОМ ужасным.
Дополнительным преимуществом использования операторов CASE является то, что вы можете добавить немного сложности без большого дополнительного кода (по сравнению с набором операторов OR). Кроме того, первое условие, которое соответствует вашим критериям, может предотвратить дополнительные оценки, что не всегда имеет место при работе с операциями OR ...
Итак, для 8 необязательных параметров со значением -1, используемым для игнорирования поиска, вы получите что-то вроде:
WHERE
@Search1 = CASE WHEN @Search1 = -1 THEN @Search1 ELSE @Column1 END
AND @Search2 = CASE WHEN @Search2 = -1 THEN @Search1 ELSE @Column2 END
AND @Search3 = CASE WHEN @Search3 = -1 THEN @Search1 ELSE @Column3 END
AND @Search4 = CASE WHEN @Search4 = -1 THEN @Search1 ELSE @Column4 END
AND @Search5 = CASE WHEN @Search5 = -1 THEN @Search1 ELSE @Column5 END
AND @Search6 = CASE WHEN @Search6 = -1 THEN @Search1 ELSE @Column6 END
AND @Search7 = CASE WHEN @Search7 = -1 THEN @Search1 ELSE @Column7 END
AND @Search8 = CASE WHEN @Search8 = -1 THEN @Search1 ELSE @Column8 END
ПРИМЕЧАНИЕ: Как указывал КМ, метод NULL терпит неудачу, если столбцы, с которыми вы работаете, могут иметь значения NULL, поскольку NULL = NULL не будет оцениваться должным образом. Так что для забавы я изменил свой ответ обратно на то, что запрашивал оригинальный постер, а именно на использование собственного идентификатора для пропуска поиска.