Significa que no se devolverán filas si @regiones NULL, cuando se usa en su primer ejemplo, incluso si hay filas en la tabla donde Regionestá NULL.
Cuando ANSI_NULLSestá activado (que siempre debe activar de todos modos, ya que la opción de no tenerlo activado se eliminará en el futuro), cualquier operación de comparación en la que (al menos) uno de los operandos se NULLproduce el tercer valor lógico - UNKNOWN( en contraposición a TRUEy FALSE).
UNKNOWNlos valores se propagan a través de cualquier combinación de operadores booleanos si aún no están decididos (por ejemplo, ANDcon un FALSEoperando o ORcon un TRUEoperando) o negaciones ( NOT).
La WHEREcláusula se utiliza para filtrar el conjunto de resultados producido por la FROMcláusula, de modo que el valor total de la WHEREcláusula debe ser TRUEpara que la fila no se filtre. Por lo tanto, si UNKNOWNse produce un por cualquier comparación, hará que la fila se filtre.
La respuesta de @ user1227804 incluye esta cita:
Si ambos lados de la comparación son columnas o expresiones compuestas, la configuración no afecta la comparación.
desde *SET ANSI_NULLS
Sin embargo, no estoy seguro de qué punto está tratando de hacer, ya que si NULLse comparan dos columnas (por ejemplo, en a JOIN), la comparación aún falla:
create table
ID int not null,
Val1 varchar(10) null
)
insert into
create table
ID int not null,
Val1 varchar(10) null
)
insert into
select * from
La consulta anterior devuelve 0 filas, mientras que:
select * from
Devuelve una fila. Entonces, incluso cuando ambos operandos son columnas, NULLno es igual NULL. Y la documentación de= no tiene nada que decir sobre los operandos:
Cuando compara dos NULLexpresiones, el resultado depende de la ANSI_NULLSconfiguración:
Si ANSI_NULLSse establece en ON, el resultado es NULL1 , siguiendo la convención ANSI de que un valor NULL(o desconocido) no es igual a otro NULLvalor desconocido.
Si ANSI_NULLSse establece en OFF, el resultado de NULLcomparado con NULLes TRUE.
La comparación NULLcon un no NULLvalor siempre da como resultado FALSE2 .
Sin embargo, tanto 1 como 2 son incorrectos; el resultado de ambas comparaciones es UNKNOWN.
* El significado críptico de este texto fue finalmente descubierto años después. Lo que realmente significa es que, para esas comparaciones, la configuración no tiene ningún efecto y siempre actúa como si la configuración estuviera ACTIVADA . Hubiera sido más claro si hubiera dicho que ese SET ANSI_NULLS OFFfue el escenario que no tuvo ningún efecto.