我有一个存储过程,如下所示:
SELECT @AdminApproved = CASE WHEN @AdminApprovalDate IS NULL
THEN 0
ELSE 1
END
据我所知CASE
语句,@AdminApproved
永远不应该是0或1之外的任何东西。它不可能是NULL。然而我却变得空洞了!任何人都可以帮助我吗?
答案 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(因为您没有指定值),并且您的选择未返回。