繁体   English   中英

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

[英]Using a tristate parameter in a stored procedure

正确的方法是什么? 例如,如何更改具有此签名的存储过程:

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

因此,为@Param赋予值1或0可以执行过滤器,但不指定它或传递NULL则不执行过滤器吗?

假设NULL表示“无关”,则使用

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

有不止一种方法。 这是一个:

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

但是它具有重复参数的缺点,如果您使用其他方式传递参数(例如,使用占位符),那么这样做就不好了。

我碰巧认为,最干净的方法是(在T-SQL中)是:

SELECT * FROM TABLE WHERE column = ISNULL(@param, column)

其他RDBMS则更喜欢COALESCE而不是ISNULL。

我认为这里的意图更加明显,尤其是当您开始添加其他OR子句时,并且在与AND子句结合使用时,也无需使用parens。

在我的(非常)有限的测试中,使用ISNULL与OR @p IS NULL相比,性能提升也可以忽略不计。 并不是说我建议使用ISNULL 是因为性能提高(充其量是非常微不足道的,而最坏的情况是受特定情况的影响),但很高兴知道它的成本不高。 坦白说,我不确定为什么这两种方法都会有所不同,但是执行计划显示出过滤器成本大约有1%的差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM