4

我有一个存储过程,如下所示:

SELECT @AdminApproved = CASE WHEN @AdminApprovalDate IS NULL
    THEN 0 
    ELSE 1
    END  

据我了解CASE@AdminApproved不应该是 0 或 1 以外的任何值。它不可能是 NULL。然而我得到了 NULL !!!! 任何人都可以帮助我吗?

4

3 回答 3

7

您的示例代码有效

根据SQL Fiddle ,这是可行的。它设置为 0 或 1。因此,如果您使用的正是您向我们展示的代码,则此变量不能是null.

declare @AdminApproved1 bit
declare @AdminApproved2 bit
select @AdminApproved1 = case when (null) is null then 0 else 1 end,
       @AdminApproved2 = case when (getdate()) is null then 0 else 1 end

-- both have values
select @AdminApproved1, @AdminApproved2;

但变量仍然可以null

因此,如果您的代码示例不完整,那么我可以向您展示另一个示例null,即使在执行select语句之后,两个上层变量也将是。我怀疑你的问题是相关的。

declare @AdminApproved1 bit
declare @AdminApproved2 bit
select @AdminApproved1 = CASE WHEN (null) IS NULL THEN 0 ELSE 1 END,
       @AdminApproved2 = CASE WHEN (getdate()) IS NULL THEN 0 ELSE 1 END
from SomeTable
where 0 = 1 -- this query yields no results

-- both are NULL when
select @AdminApproved1, @AdminApproved2;
于 2013-03-21T12:24:35.017 回答
0

您不能从该查询中获得 null,因此您的代码中的其他地方肯定有其他错误。很可能有一些东西使该查询根本无法执行。

测试以验证结果:

declare @AdminApproved int
declare @AdminApprovalDate datetime

-- testing with null

set @AdminApprovalDate = null

SELECT @AdminApproved = CASE WHEN @AdminApprovalDate IS NULL
    THEN 0 
    ELSE 1
    END

select @AdminApproved

-- testing with a date

set @AdminApprovalDate = getdate()

SELECT @AdminApproved = CASE WHEN @AdminApprovalDate IS NULL
    THEN 0 
    ELSE 1
    END

select @AdminApproved

输出:

0

1
于 2013-03-21T12:31:05.567 回答
0

如果在选择内没有返回行,则分配一个值SELECT保留分配之前的原始值。(实际上,值将是NULL保留值是不正确的。

只有 SET 的情况可能是不返回行的赋值将值设置为NULL

因此,在您的特殊情况下,先前的值是 NULL (因为您没有分配值)并且您的选择没有返回。

于 2013-03-21T12:34:36.880 回答