【发布时间】:2016-12-09 11:44:52
【问题描述】:
我在 SQL Server 上有一个存储过程,它采用 3 个参数,所有参数都是可选的。
参数为month、year 和class(仅作为示例)。
如果没有值通知month,则默认值为当前月份,对于year,默认值为当前年份。
然后在类中,如果没有通知值,则不会使用where 条件,或者至少是WHERE class IS NOT NULL(必须返回所有class)。
存储过程根据参数运行一个select。
存储过程:
CREATE PROCEDURE [dbo].[SP_TEST]
@month INT,
@year INT,
@class NVARCHAR(10) = NULL
AS
BEGIN
SET NOCOUNT ON
IF @month IS NULL
SET @month = MONTH(GETDATE())
IF @year IS NULL
SET @year = YEAR(GETDATE())
SELECT
*
FROM
TABLE_TEST V
WHERE
MONTH(V.DATE) = @month AND
YEAR(V.DATE) = @year AND
CLASS = ???
所以,在WHERE,我尝试了以下代码:
代码 01:
WHERE
MONTH(V.DATE) = @month AND
YEAR(V.DATE) = @year AND
(@class IS NOT NULL AND CLASS = @class)
结果:
如果我将值传递给
@class,一切正常如果我将
NULL传递给@class,则不会返回任何内容。
代码 02:
WHERE
MONTH(V.DATE) = @month AND
YEAR(V.DATE) = @year AND
V.CLASS = CASE WHEN @class != NULL THEN @class END
结果:
如果我将值传递给
@class,则不会返回任何内容。如果我将
NULL传递给@class,则不会返回任何内容。
我如何调用存储过程:
在class 上使用NULL:
EXEC [dbo].[SP_TEST]
@month = NULL,
@year = NULL,
@class = NULL
有一些class:
EXEC [dbo].[SP_TEST]
@month = NULL,
@year = NULL,
@class = 'TEST_A'
【问题讨论】:
-
02)
@class != NULL>>>@class IS NULL/@class IS NOT NULL01)@class IS NOT NULL AND CLASS = @class- 如果@class 为 NULL(这是你的观点)那又怎样?你几乎做到了。 -
我将 01 更新为
((@class IS NOT NULL AND V.CLASS = @class) OR (@class IS NULL))并且工作了!
标签: sql-server stored-procedures sql-server-2016