这样做的正确方法是什么?例如,我将如何使用此签名更改存储过程:
CREATE PROCEDURE dbo.MyProcedure
@Param BIT = NULL
AS
SELECT *
FROM dbo.SomeTable T
WHERE T.SomeColumn = @Param
所以给@Param 赋值1 或0 执行过滤,但不指定它或传递NULL 不执行过滤?
这样做的正确方法是什么?例如,我将如何使用此签名更改存储过程:
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 子句组合时不需要括号。
在我(非常)有限的测试中,使用 ISNULL 与 OR @p IS NULL 相比,性能增加也可以忽略不计。并不是说我提倡使用 ISNULL是因为性能提高(这充其量是非常微不足道的,并且在最坏的情况下会受到非常具体的情况的影响),但很高兴知道它没有显着的成本。坦率地说,我不确定为什么它会有所不同,但执行计划显示过滤器成本大约有 1% 的差异。