вам нужно прочитать Условия динамического поиска в T-SQL Эрланда Соммарского Есть много методов для поддержки запросов, которые используют многочисленные необязательные параметры фильтра. Хитрость в том, чтобы выбрать правильную стратегию, и делать тысячу IFs - не самое лучшее.
Если у вас правильная версия SQL Server 2008 (SQL 2008 с пакетом обновления 1 (SP1) CU5 (10.0.2746) и выше), вы можете использовать этот маленький трюк для фактического использования индекса: добавьте OPTION (RECOMPILE)
к вашему запросу, см. Статья Эрланда , и SQL Server разрешит OR
из (@OptionalParameter IS NULL OR YourColumn= @OptionalParameter )
до того, как план запроса будет создан на основе значений времени выполнения локальных переменных, и индекс может быть использован.
Это будет работать для любой версии SQL Server (возвращать правильные результаты), но включайте только OPTION (RECOMPILE), если вы используете SQL 2008 SP1 CU5 (10.0.2746) и более поздние версии. ОПЦИЯ (RECOMPILE) перекомпилирует ваш запрос, только перечисленная версия перекомпилирует его на основе текущих значений времени выполнения локальных переменных, что даст вам наилучшую производительность. Если не в этой версии SQL Server 2008, просто оставьте эту строку отключенной. Просто помните, что OR
может убить использование индекса, но в правильной версии SQL Server 2008, OPTION(RECOMPILE)
будет использовать индекс.
--sample procedure that uses optional search parameters
CREATE PROCEDURE YourProcedure
@FirstName varchar(25) = null,
@LastName varchar(25) = null,
@Title varchar(25) = null
AS
BEGIN
SELECT ID, FirstName, LastName, Title
FROM tblUsers
WHERE
(@FirstName IS NULL OR (FirstName = @FirstName))
AND (@LastNameIS NULL OR (LastName= @LastName))
AND (@TitleIS NULL OR (Title= @Title))
OPTION (RECOMPILE) ---<<<<use if on for SQL 2008 SP1 CU5 (10.0.2746) and later
END