2012-01-25 69 views
5

Acabo de encontrar un problema interesante con un procedimiento que estoy escribiendo en SQL.¿Por qué la comparación de una variable de fecha SQL a null se comporta de esta manera?

En mi proc tengo 2 fechas, que son parametros opcionales por defecto en NULL, quiero comprobar si estos parametros no son nulos y si no se ejecutan parte de mi proc, si son nulos entonces la parte adicional de la proc es ignorado

Hice una declaración bastante básica IF(@dateVariable <> NULL AND @DateVariable2 <> NULL), pero la instrucción if nunca funciona incluso si las variables no son nulas, supongo que SQL está luchando por comparar la fecha con un NULL, lo cual es extraño ya que datetime es anulable.

Para solucionar esto acabo de hacer IF(DateVariable IS NOT NULL) que funciona correctamente. También probé IF(ISNULL(@DateVariable,'') <> ''), que también funciona correctamente

Así que mi pregunta es ¿por qué la primera IF no funciona, pero la segunda y la tercera sí lo hacen ya que ambas deben en algún momento comparar el contenido de la variable a nulo?

Ejemplo:

----- ----- falla

DECLARE @Date DATETIME 
SET @Date = CURRENT_TIMESTAMP 

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

----- ----- Trabaja

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

[lógica trivalente] (http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued -logic /) –

+0

Piensa en 'NULL' como' Unknown Yet Value'. ¿Qué debería '@Date = Unknown Yet Value' yield? '¿Verdad'? 'Falso'? O 'No lo sabemos'? –

Respuesta

13

En pocas palabras 'NULL 'no es igual a' NULL '. 'NULL' es comparable a un estado de incertidumbre, donde una cosa que es incierta no necesariamente es igual a otra cosa que también es incierta. Use 'IS NULL', 'ISNULL()' o 'COALESCE()' cuando pruebe null. Establecer ANSI_NULLS en 'off' puede cambiar este comportamiento, pero no es el estándar ANSI SQL. Vea http://msdn.microsoft.com/en-us/library/ms191270.aspx para más información.

4

Se debe tener cuidado al comparar los valores nulos. El comportamiento de la comparación depende de la configuración de la opción SET ANSI_NULLS.

Cuando SET ANSI_NULLS está activado, una comparación en la que una o más de las expresiones es NULL no produce TRUE o FALSE; rinde UNKNOWN. Esto se debe a que un valor desconocido no se puede comparar lógicamente con ningún otro valor. Esto ocurre si se compara una expresión con el NULL literal, o si se comparan dos expresiones y una de ellas se evalúa como NULL.

Ver NULL Comparison Search Conditions

+2

'SET ANSI_NULLS OFF' está en desuso. http://msdn.microsoft.com/en-us/library/ms143729.aspx –

Cuestiones relacionadas