2009-09-20 71 views
1

我有以下查询(在存储过程运行):SQL Server 2008中 - 忽略空值

DECLARE @BrandId唯一标识符

SELECT * FROM产品p其中p.BrandId = @BrandId

我的问题是 - 当NULL传递到@BrandId查询(正确地)不返回任何结果 - 在那里告诉SQL的方式,当NULL被传递到@BrandId(不使用大量返回所有行的IF语句,即 - IF @BrandId IS NULL等)? - 即当'忽略'where子句的那部分时,如果@BrandId = NULL。

以上是一个简化示例 - 真正的查询更长,并且有多个变量(如@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 2009-09-20 09:58:31

+0

这种形式也容易参数嗅探,可能导致非常糟糕的执行计划,这取决于如何第一次调用过程。 http://sqlinthewild.co.za/index.php/2009/09/15/multiple-execution-paths/ – GilaMonster 2009-09-21 08:45:55