2015-12-10 32 views
0

爲什麼@OpeningDate被保存爲NULL,即使我這樣做。爲什麼日期字段被保存爲空?

PROCEDURE [dbo].[InsertCaseANDHearingDetails] 

    @HearingDate datetime, 

    @IsOpeningDate bit= null, 
    @OpeningDate date= null, 

AS 
Begin 
     IF(@IsOpeningDate = 0) 
     Begin 
      Set @OpeningDate= (Select Convert(varchar, @HearingDate, 106)) 
     End 

     Insert Into Hearings 
     values (@HearingDate, @OpeningDate) 


End 

即使我計算它,開庭日期不爲空,但爲什麼OpeningDate是越來越保存爲NULL。

+1

包含您對'dbo.InsertCaseAndHearingDetails'的調用。 –

回答

3

@HearingDate != NULL將不起作用。這種比較的結果總是是unknown。改爲使用@HearingDate is not null

因爲變量@HearingDate未初始化,所以它將具有null值。

此外,變量@OpeningDate不會設置爲Select Convert(varchar, @HearingDate, 106),因爲if條件評估爲unknown

因此,當您從表中選擇值時,它們將是null

編輯:

@IsOpeningDate bit= null 
... 
IF(@IsOpeningDate = 0) 

,該條件評估,以unknown過,因爲這是做0 = null。您不能null比較。

+0

你能否詳細說一下「這種比較的結果總是未知的」? –

+0

但我如果通過增加另一個BIT柱 改變了條件(@IsOpeningClosingDate = 1) –

+0

和把這個如果conditon塊 集@ OpeningDate =(選擇轉換(VARCHAR,@HearingDate,106)) –

0

如果您在Proc開始時使用以下內容,它將起作用。

SET ANSI_NULLS OFF 

基本上NULL不能相比,即使不與自身的,因爲這不是一個值。如果有的話,你想讓引擎把它當作一個,你需要引發ANSI_NULLS屬性。也就是說,我寧願隨時使用@ vkp的答案。

根據您的編輯,它看​​起來像下面的條件不滿足:

IF(@IsOpeningDate = 0) 

,因此,它仍然是NULL。

在你爲什麼不檢查,如果條件
+0

「在SQL Server的未來版本中,ANSI_NULLS將始終爲ON,並且任何應用程序將該選項顯式設置爲OFF會產生錯誤,請避免在新開發工作中使用此功能,並計劃修改當前使用此功能的應用程序。「 https://msdn.microsoft.com/en-us/library/ms188048.aspx –

+0

這個問題不是在SQL-Server-2008和SQL-Server-2012下標記的嗎? – SouravA

+0

而且代碼將永遠不會遷移到未來版本的SQL Server? –

0

是空的,而不是它

IF(@IsOpeningDate = 0) 

我的建議

IF(@IsOpeningDate IS NULL) 
0

對不起,這是我的錯誤比較0

你的查詢沒有提及插入語句中的參數,並且由於允許NULL,所以它插入NULL NULL

感謝您的幫助,因爲這導致我發現實際上發生了什麼。

相關問題