Isso significa que nenhuma linha será retornada se @region
for NULL
, quando usado em seu primeiro exemplo, mesmo se houver linhas na tabela onde Region
é NULL
.
Quando ANSI_NULLS
está ligado (que você deve sempre definir de qualquer maneira, uma vez que a opção de não tê-lo ativado será removida no futuro), qualquer operação de comparação onde (pelo menos) um dos operandos está NULL
produz o terceiro valor lógico - UNKNOWN
( em oposição a TRUE
e FALSE
).
UNKNOWN
os valores se propagam por meio de qualquer combinação de operadores booleanos se ainda não estiverem decididos (por exemplo, AND
com um FALSE
operando ou OR
com um TRUE
operando) ou negações ( NOT
).
A WHERE
cláusula é usada para filtrar o conjunto de resultados produzido pela FROM
cláusula, de modo que o valor geral da WHERE
cláusula deve ser TRUE
para que a linha não seja filtrada. Portanto, se um UNKNOWN
for produzido por qualquer comparação, ele fará com que a linha seja filtrada.
A resposta de @ user1227804 inclui esta citação:
Se ambos os lados da comparação forem colunas ou expressões compostas, a configuração não afetará a comparação.
de *SET ANSI_NULLS
No entanto, não tenho certeza de que ponto ele está tentando fazer, pois se duas NULL
colunas forem comparadas (por exemplo, em a JOIN
), a comparação ainda falhará:
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
A consulta acima retorna 0 linhas, enquanto:
select * from
Retorna uma linha. Portanto, mesmo quando ambos os operandos são colunas, NULL
não é igual NULL
. E a documentação para=
não tem nada a dizer sobre os operandos:
Quando você compara duas NULL
expressões, o resultado depende da ANSI_NULLS
configuração:
Se ANSI_NULLS
for definido como ON
, o resultado será NULL
1 , seguindo a convenção ANSI de que um valor NULL
(ou desconhecido) não é igual a outro NULL
valor desconhecido.
Se ANSI_NULLS
for definido como OFF
, o resultado de NULL
comparado com NULL
é TRUE
.
Comparar NULL
com um NULL
valor não sempre resulta em FALSE
2 .
No entanto, 1 e 2 estão incorretos - o resultado de ambas as comparações é UNKNOWN
.
* O significado enigmático deste texto foi finalmente descoberto anos depois. O que realmente significa é que, para essas comparações, a configuração não tem efeito e sempre atua como se a configuração estivesse ativada . Teria sido mais claro se tivesse declarado que SET ANSI_NULLS OFF
era a configuração que não teve efeito.