Significa que no se devolverán filas si @region
es NULL
, cuando se usa en su primer ejemplo, incluso si hay filas en la tabla donde Region
está NULL
.
Cuando ANSI_NULLS
está 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 NULL
produce el tercer valor lógico - UNKNOWN
( en contraposición a TRUE
y FALSE
).
UNKNOWN
los valores se propagan a través de cualquier combinación de operadores booleanos si aún no están decididos (por ejemplo, AND
con un FALSE
operando o OR
con un TRUE
operando) o negaciones ( NOT
).
La WHERE
cláusula se utiliza para filtrar el conjunto de resultados producido por la FROM
cláusula, de modo que el valor total de la WHERE
cláusula debe ser TRUE
para que la fila no se filtre. Por lo tanto, si UNKNOWN
se 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 NULL
se 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, NULL
no es igual NULL
. Y la documentación de=
no tiene nada que decir sobre los operandos:
Cuando compara dos NULL
expresiones, el resultado depende de la ANSI_NULLS
configuración:
Si ANSI_NULLS
se establece en ON
, el resultado es NULL
1 , siguiendo la convención ANSI de que un valor NULL
(o desconocido) no es igual a otro NULL
valor desconocido.
Si ANSI_NULLS
se establece en OFF
, el resultado de NULL
comparado con NULL
es TRUE
.
La comparación NULL
con un no NULL
valor siempre da como resultado FALSE
2 .
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 OFF
fue el escenario que no tuvo ningún efecto.