Cela signifie qu'aucune ligne ne sera retournée si @regionest NULL, lorsqu'elle est utilisée dans votre premier exemple, même s'il y a des lignes dans la table où Regionest NULL.
Quand ANSI_NULLSest activé (ce que vous devriez toujours activer de toute façon, puisque l'option de ne pas l'activer va être supprimée à l'avenir), toute opération de comparaison où (au moins) l'un des opérandes est NULLproduit la troisième valeur logique - UNKNOWN( par opposition à TRUEet FALSE).
UNKNOWNles valeurs se propagent à travers tout opérateur booléen combinant si elles ne sont pas déjà décidées (par exemple ANDavec un FALSEopérande ou ORavec un TRUEopérande) ou des négations ( NOT).
La WHEREclause est utilisée pour filtrer le jeu de résultats produit par la FROMclause, de sorte que la valeur globale de la WHEREclause doit être TRUEpour que la ligne ne soit pas filtrée. Ainsi, si un UNKNOWNest produit par une comparaison, cela entraînera le filtrage de la ligne.
La réponse de @ user1227804 comprend cette citation:
Si les deux côtés de la comparaison sont des colonnes ou des expressions composées, le paramètre n'affecte pas la comparaison.
à partir de *SET ANSI_NULLS
Cependant, je ne sais pas sur quel point il essaie de faire valoir, car si deux NULLcolonnes sont comparées (par exemple en a JOIN), la comparaison échoue toujours:
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 requête ci-dessus renvoie 0 ligne, alors que:
select * from
Renvoie une ligne. Donc, même lorsque les deux opérandes sont des colonnes, cela NULLn'est pas égal NULL. Et la documentation de= n'a rien à dire sur les opérandes:
Lorsque vous comparez deux NULLexpressions, le résultat dépend du ANSI_NULLSparamètre:
Si ANSI_NULLSest défini sur ON, le résultat est NULL1 , suivant la convention ANSI selon laquelle une valeur NULL(ou inconnue) n'est pas égale à une autre NULLvaleur inconnue.
Si ANSI_NULLSest défini sur OFF, le résultat de NULLcomparé à NULLest TRUE.
La comparaison NULLavec une non- NULLvaleur donne toujours FALSE2 .
Cependant, 1 et 2 sont incorrects - le résultat des deux comparaisons est UNKNOWN.
* La signification cryptique de ce texte a finalement été découverte des années plus tard. Cela signifie en fait que, pour ces comparaisons, le paramètre n'a aucun effet et agit toujours comme si le paramètre était activé . Cela aurait été plus clair s'il avait déclaré que SET ANSI_NULLS OFFc'était le paramètre qui n'avait aucun effet.