Significa che nessuna riga verrà restituita se @regionè NULL, se utilizzata nel primo esempio, anche se sono presenti righe nella tabella in cui si Regiontrova NULL.
Quando ANSI_NULLSè attivo (che dovresti sempre impostare comunque, poiché l'opzione per non averlo verrà rimossa in futuro), qualsiasi operazione di confronto in cui (almeno) uno degli operandi è NULLproduce il terzo valore logico - UNKNOWN( al contrario di TRUEe FALSE).
UNKNOWNi valori si propagano attraverso qualsiasi combinazione di operatori booleani se non sono già decisi (ad esempio ANDcon un FALSEoperando o ORcon un TRUEoperando) o negazioni ( NOT).
La WHEREclausola viene utilizzata per filtrare il set di risultati prodotto dalla FROMclausola, in modo tale che il valore complessivo della WHEREclausola deve essere TRUEaffinché la riga non venga filtrata. Quindi, se un confronto UNKNOWNviene prodotto da qualsiasi confronto, la riga verrà filtrata.
La risposta di @ user1227804 include questa citazione:
Se entrambi i lati del confronto sono colonne o espressioni composte, l'impostazione non influisce sul confronto.
da *SET ANSI_NULLS
Tuttavia, non sono sicuro di quale punto stia cercando di fare, poiché se NULLvengono confrontate due colonne (ad esempio in a JOIN), il confronto non riesce ancora:
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 query precedente restituisce 0 righe, mentre:
select * from
Restituisce una riga. Quindi, anche quando entrambi gli operandi sono colonne, NULLnon è uguale NULL. E la documentazione per= non ha nulla da dire sugli operandi:
Quando confronti due NULLespressioni, il risultato dipende ANSI_NULLSdall'impostazione:
Se ANSI_NULLSè impostato su ON, il risultato è NULL1 , seguendo la convenzione ANSI che un valore NULL(o sconosciuto) non è uguale a un altro NULLo sconosciuto.
Se ANSI_NULLSè impostato su OFF, il risultato di NULLrispetto a NULLè TRUE.
Il confronto NULLcon un non NULLvalore risulta sempre in FALSE2 .
Tuttavia, sia 1 che 2 non sono corretti: il risultato di entrambi i confronti lo è UNKNOWN.
* Il significato criptico di questo testo è stato finalmente scoperto anni dopo. Ciò che in realtà significa è che, per questi confronti, l'impostazione non ha effetto e si comporta sempre come se l'impostazione fosse ON . Sarebbe stato più chiaro se avesse affermato che SET ANSI_NULLS OFFera l'impostazione che non ha avuto alcun effetto.