以下のようなストアドプロシージャがあります。
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を取得しています!!!! 誰でも同じことで私を助けることができますか?
According to SQL Fiddle this works. It's either set to 0 or 1. So if you're using exactly the code you're showing us this variable can't be 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
So if your code example isn't complete then I can show you another example where both upper variables would be null
even after executing select
statement. And I suspect that your problem is related.
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;
で値を割り当てると、選択内で行が返されない場合、割り当て前の元の値SELECT
が保持されます。(実際には、値がNULL
保存された値になるというのは真実ではありません。
行を返さない割り当てで値が に設定されるのは、SET の場合のみNULL
です。
したがって、特別なケースでは、値の前の値は NULL であり (値を割り当てなかったため)、select は返されませんでした。
そのクエリから 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