2009-09-20 5 views
1

У меня есть следующий запрос (запуск в sproc):SQL Server 2008 - игнорирование нулевых значений

DECLARE @BrandId UniqueIdentifier

SELECT * FROM Products WHERE р p.BrandId = @BrandId

Мой вопрос - когда NULL передается в @BrandId запрос (правильно) не возвращает никаких результатов - есть ли способ сказать SQL вернуть все строки, когда NULL передается в @BrandId (без использования много из IF-утверждения, то есть - IF @BrandId IS NULL и т. Д.)? - то есть, если @BrandId = NULL, когда «игнорировать» эту часть предложения where.

Вышеприведенный пример - реальный запрос длиннее и имеет несколько переменных (например, @BrandId), которым могут быть переданы пустые значения, - и желаемое поведение заключается в том, чтобы они не ограничивали результаты запроса, когда нулевое значение равно прошло.

Спасибо!

ответ

2
DECLARE @BrandId uniqueidentifier; 

SELECT * FROM Products p WHERE p.BrandId = ISNULL(@BrandId, p.BrandId); 

Мой единственный комментарий здесь является то, что если у вас есть много продуктов, этот шаблон запроса не будет оптимизированная для случая, когда BrandId является NULL (если поставить запрос в хранимой процедуре), потому что только один план может быть сохранен для каждой процедуры для каждого оператора.

Если вы используете это заявление в хранимую процедуре, и вы действительно заботитесь о высокой производительности (то есть, если у вас есть много продуктов, и вы используете этот запрос много), вы должны использовать:

IF @BrandId IS NULL BEGIN 
    SELECT * FROM Products p; 
END ELSE BEGIN 
    SELECT * FROM Products p WHERE p.BrandId = @BrandId; 
END 
+0

отличное - спасибо! – db1234

+0

Эта форма также подвержена параметру нюхания, может привести к очень плохим планам exec, в зависимости от того, как первый вызов proc вызывается. http://sqlinthewild.co.za/index.php/2009/09/15/multiple-execution-paths/ – GilaMonster

Смежные вопросы