程序 - 案例陈述错误

时间:2013-03-21 12:16:59

标签: sql sql-server

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

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

据我所知CASE语句,@AdminApproved永远不应该是0或1之外的任何东西。它不可能是NULL。然而我却变得空洞了!任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分: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

因此,如果您的代码示例未完成,则I can show you another example即使在执行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;

答案 1 :(得分: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

答案 2 :(得分:0)

如果在select中没有返回任何行,那么使用SELECT分配值将保留原始值。 (实际上并非如此,该值将为NULL它将是保留值。

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

因此,在您的特殊情况下,值之前的值为NULL(因为您没有指定值),并且您的选择未返回。