这样做的正确方法是什么?例如,如何使用此签名更改存储过程:
CREATE PROCEDURE dbo.MyProcedure
@Param BIT = NULL
AS
SELECT *
FROM dbo.SomeTable T
WHERE T.SomeColumn = @Param
因此给@Param赋值为1或0会执行过滤器,但不指定它或传递NULL不执行过滤?
答案 0 :(得分:5)
假设NULL表示“不关心”,则使用
CREATE PROCEDURE dbo.MyProcedure
@Param BIT = NULL
AS
SELECT *
FROM dbo.SomeTable T
WHERE T.SomeColumn = @Param OR @Param IS NULL
答案 1 :(得分:1)
不止一种方式。这是一个:
SELECT *
FROM dbo.SomeTable T
WHERE T.SomeColumn = COALESCE(@Param, T.SomeColumn)
但这不包括T.SomeColumn为NULL的行。
以下替代方案将包括以下行:
SELECT *
FROM dbo.SomeTable T
WHERE T.SomeColumn = @Param OR @Param IS NULL
但它有重复参数的缺点,如果您使用其他方式传入参数(例如,使用占位符),则不太好。
答案 2 :(得分:0)
我碰巧认为最简单的方法是(在T-SQL中):
SELECT * FROM TABLE WHERE column = ISNULL(@param, column)
其他RDBMS更喜欢COALESCE而不是ISNULL。
我认为这里的意图更明显,特别是当你开始添加其他OR子句时,它也会让你在与AND子句结合时不需要parens。
在我(非常)有限的测试中,使用ISNULL与OR @p IS NULL的增加也是微不足道的。并不是说我提倡使用ISNULL ,因为的性能增加(最好是非常边缘,并且在最坏情况下会受到非常特殊的情况)但很高兴知道它没有显着性成本。坦率地说,我不确定为什么它会产生任何影响,但执行计划显示滤波器成本差异大约为1%。