我有一个存储过程,如下所示:
SELECT @AdminApproved = CASE WHEN @AdminApprovalDate IS NULL
THEN 0
ELSE 1
END
据我了解CASE
,@AdminApproved
不应该是 0 或 1 以外的任何值。它不可能是 NULL。然而我得到了 NULL !!!! 任何人都可以帮助我吗?
我有一个存储过程,如下所示:
SELECT @AdminApproved = CASE WHEN @AdminApprovalDate IS NULL
THEN 0
ELSE 1
END
据我了解CASE
,@AdminApproved
不应该是 0 或 1 以外的任何值。它不可能是 NULL。然而我得到了 NULL !!!! 任何人都可以帮助我吗?
根据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;
您不能从该查询中获得 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
如果在选择内没有返回行,则分配一个值SELECT
将保留分配之前的原始值。(实际上,值将是NULL
保留值是不正确的。
只有 SET 的情况可能是不返回行的赋值将值设置为NULL
。
因此,在您的特殊情况下,先前的值是 NULL (因为您没有分配值)并且您的选择没有返回。