1

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

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

所以给@Param 赋值1 或0 执行过滤,但不指定它或传递NULL 不执行过滤?

4

3 回答 3

5

假设 NULL 表示“不在乎”,然后使用

CREATE PROCEDURE dbo.MyProcedure 
   @Param BIT = NULL
AS
   SELECT *
   FROM dbo.SomeTable T
   WHERE T.SomeColumn = @Param OR @Param IS NULL
于 2008-10-10T15:48:32.953 回答
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

但它有重复参数的缺点,如果您使用另一种方式来传递参数,例如使用占位符,这并不好。

于 2008-10-10T16:30:16.910 回答
0

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

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

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

我认为这里的意图更明显,特别是当您开始添加其他 OR 子句时,它还使您在与 AND 子句组合时不需要括号。

在我(非常)有限的测试中,使用 ISNULL 与 OR @p IS NULL 相比,性能增加也可以忽略不计。并不是说我提倡使用 ISNULL是因为性能提高(这充其量是非常微不足道的,并且在最坏的情况下会受到非常具体的情况的影响),但很高兴知道它没有显着的成本。坦率地说,我不确定为什么它会有所不同,但执行计划显示过滤器成本大约有 1% 的差异。

于 2008-10-10T16:29:39.437 回答