在存储过程中使用三态参数

时间:2008-10-10 15:46:22

标签: sql stored-procedures

这样做的正确方法是什么?例如,如何使用此签名更改存储过程:

CREATE PROCEDURE dbo.MyProcedure
  @Param BIT = NULL
AS
  SELECT *
  FROM dbo.SomeTable T
  WHERE T.SomeColumn = @Param

因此给@Param赋值为1或0会执行过滤器,但不指定它或传递NULL不执行过滤?

3 个答案:

答案 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%。