2012-01-25 10 views
5

Ho appena trovato un problema interessante con una procedura che sto scrivendo in SQL.Perché il confronto di una variabile data SQL con null si comporta in questo modo?

Nel mio proc ho 2 date, che sono parametri facoltativi predefiniti a NULL, voglio controllare se questi parametri non sono nulli e se non vengono eseguiti parte del mio proc, se sono nulli quindi la parte aggiuntiva del proc è ignorato

ho fatto un IF(@dateVariable <> NULL AND @DateVariable2 <> NULL) dichiarazione abbastanza semplice, ma l'istruzione if non funziona mai, anche se le variabili non sono nulli, vorrei assumere SQL sta lottando per confrontare la data per un valore NULL che è strano dato datetime è annullabile.

Per aggirare questo ho appena fatto IF(DateVariable IS NOT NULL) che funziona correttamente. Ho anche provato IF(ISNULL(@DateVariable,'') <> '') che funziona correttamente

Quindi la mia domanda è: perché il primo IF non funziona, ma il secondo e il terzo IF fanno entrambi, poiché entrambi devono a un certo punto confrontare il contenuto della variabile in null?

Esempio:

----- ----- Fails

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (@Date <> NULL) 
BEGIN 
    print('a') 
END 

----- ----- Opere

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (ISNULL(@Date,'') <> '') 
BEGIN 
    print('a') 
END 

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

IF (@Date IS NOT NULL) 
BEGIN 
    print('a') 
END 
+3

[Tre Logic Valued] (http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued -logic /) –

+0

Pensa a 'NULL' come' Unknown Yet Value'. Cosa dovrebbe dare '@Date = Unknown Yet Value'? 'True'? 'False'? O "Non lo sappiamo"? –

risposta

13

poche parole 'NULL 'non è uguale a' NULL '. 'NULL' è paragonabile a uno stato di incertezza, in cui una cosa incerta non corrisponde necessariamente a qualcos'altro che è anche incerto. Utilizzare 'IS NULL', 'ISNULL()' o 'COALESCE()' quando si esegue il test dei valori nulli. Impostare ANSI_NULLS su 'off' può modificare questo comportamento, ma non è lo standard ANSI SQL. Vedi http://msdn.microsoft.com/en-us/library/ms191270.aspx per maggiori informazioni.

4

Fare attenzione quando si confrontano valori nulli. Il comportamento del confronto dipende dall'impostazione dell'opzione SET ANSI_NULLS.

Quando SET ANSI_NULLS è ON, un confronto in cui una o più espressioni è NULL non restituisce VERO o FALSO; restituisce SCONOSCIUTO. Questo perché un valore sconosciuto non può essere confrontato logicamente contro qualsiasi altro valore. Ciò si verifica se un'espressione viene confrontata con il valore letterale NULL o se vengono confrontate due espressioni e una di esse viene valutata su NULL.

Vedi NULL Comparison Search Conditions

+2

'SET ANSI_NULLS OFF' è deprecato. http://msdn.microsoft.com/en-us/library/ms143729.aspx –

Problemi correlati