2011-06-29 21 views
8

En Microsoft SQL, que tienen la siguiente declaración (más o menos):¿Cómo se obtiene SQL para reconocer WHERE column = NULL?

UPDATE sometable 
    SET somecolumn = @somevalue 
WHERE somecolumn = NULL; 

@somevalue se establece previamente en el guión.

Esto funciona bien y SQL me dice que cero filas se ven afectadas. Hay cinco filas donde somecolumn es NULL. ¿Qué estoy haciendo mal?

+1

Para responder a la pregunta en el título, literalmente, usaría 'SET ANSI_NULLS OFF'. Esta opción está (correctamente) obsoleta y deberías usar 'IS NULL' –

Respuesta

17

En su lugar, debe usar IS NULL para probar un valor NULO en la columna.

UPDATE sometable SET somecolumn = @somevalue WHERE somecolumn IS NULL; 
+0

Ha, error de principiante ... ¡gracias! – Peter

+2

Un valor NULL no puede ser igual a ningún valor, incluso a otro NULL. – acermate433s

+5

@Peter: NULL no es un valor; es un marcador de posición para * la falta de cualquier valor * –

3

Joe tiene razón. Nada puede IGUAL nulo. Solo puede SER nulo, por lo tanto, UPDATE mytable SET mycolumn = @value WHERE anotherColumn IS NULL.

+0

Nada puede ser igual a cero cuando se trata de cometer errores con SQL. – onedaywhen

1

ANSI SQL defines NULL como no equivalentes a nada, incluso a otra instancia de NULL. La forma canónica es utilizar IS NULL y IS NOT NULL.

También existe la opción MS SQL Server SET ANSI_NULLS. Desactivar esta opción tiene el efecto de tener WHERE x = NULL haciendo exactamente lo que espera. También, sin embargo, incluirá cualquier valor NULL en una consulta como WHERE x <> 'abc', que puede no ser lo que esperas. Esta opción es específica de la conexión, por lo que cambiarla para su conexión no afectará a los demás. También puede establecer una configuración predeterminada en el nivel de la base de datos. Al crear un procedimiento almacenado, la opción se captura en creación tiempo - no en tiempo de ejecución.

Otro truco consiste en crear una consulta como WHERE ISNULL(x, '') = ISNULL(@x, ''). No creo que sea SARGable, por lo que el rendimiento no es tan bueno como WHERE (x IS NULL AND @x IS NULL) OR (x = @x), pero es mucho mejor escribir y construir dinámicamente.

Ah, y, como estamos hablando de ANSI SQL. La versión ANSI SQL de ISNULL es COALESCE.

Cuestiones relacionadas