Динамически изменяющиеся поисковые запросы, основанные на данных параметрах, являются сложным предметом и делают это один за другим, даже с очень незначительной разницей, могут иметь серьезные последствия для производительности. Ключ должен использовать индекс, игнорировать компактный код, игнорировать беспокойство о повторении кода, вы должны составить хороший план выполнения запроса (использовать индекс).
Прочитайте это и рассмотрите все методы. Ваш лучший метод будет зависеть от ваших параметров, ваших данных, вашей схемы и фактического использования:
Условия динамического поиска в T-SQL by Erland Sommarskog
Проклятие и благословения динамического SQL от Erland Sommarskog
Если у вас есть соответствующая версия SQL Server 2008 (SQL 2008 SP1 CU5 (10.0.2746) и более поздняя версия), вы может использовать этот небольшой трюк для фактического использования индекса:
Добавить OPTION (RECOMPILE)
в ваш запрос, см. статью Erland , а SQL Server разрешит OR
из (@LastName IS NULL OR LastName= @LastName)
до того, как план запроса будет создан на основе значений времени выполнения локальных переменных и будет использоваться индекс.
Это будет работать для любой версии SQL Server (вернет правильные результаты), но включит только OPTION (RECOMPILE), если вы используете SQL Server 2008 SP1 CU5 (10.0.2746) и позже. OPTION (RECOMPILE) перекомпилирует ваш запрос, только перечисленная версия перекомпилирует его на основе текущих значений времени выполнения локальных переменных, что даст вам лучшую производительность. Если не в этой версии SQL Server 2008, просто оставьте эту строку выключенной.
CREATE PROCEDURE spDoSearch
@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 (@LastName IS NULL OR (LastName = @LastName ))
AND (@Title IS NULL OR (Title = @Title ))
OPTION (RECOMPILE) ---<<<