Isso significa que nenhuma linha será retornada se @regionfor NULL, quando usado em seu primeiro exemplo, mesmo se houver linhas na tabela onde Regioné NULL.
Quando ANSI_NULLSestá 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á NULLproduz o terceiro valor lógico - UNKNOWN( em oposição a TRUEe FALSE).
UNKNOWNos valores se propagam por meio de qualquer combinação de operadores booleanos se ainda não estiverem decididos (por exemplo, ANDcom um FALSEoperando ou ORcom um TRUEoperando) ou negações ( NOT).
A WHEREcláusula é usada para filtrar o conjunto de resultados produzido pela FROMcláusula, de modo que o valor geral da WHEREcláusula deve ser TRUEpara que a linha não seja filtrada. Portanto, se um UNKNOWNfor 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 NULLcolunas 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, NULLnão é igual NULL. E a documentação para= não tem nada a dizer sobre os operandos:
Quando você compara duas NULLexpressões, o resultado depende da ANSI_NULLSconfiguração:
Se ANSI_NULLSfor definido como ON, o resultado será NULL1 , seguindo a convenção ANSI de que um valor NULL(ou desconhecido) não é igual a outro NULLvalor desconhecido.
Se ANSI_NULLSfor definido como OFF, o resultado de NULLcomparado com NULLé TRUE.
Comparar NULLcom um NULLvalor não sempre resulta em FALSE2 .
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 OFFera a configuração que não teve efeito.