Es bedeutet , dass keine Zeilen zurückgegeben werden , wenn @regionist NULL, wenn in Ihrem ersten Beispiel verwendet wird , auch wenn es Zeilen in der Tabelle , wo Regionist NULL.
Wenn aktiviert ANSI_NULLSist (was Sie sowieso immer aktivieren sollten, da die Option, es nicht zu aktivieren, in Zukunft entfernt wird), erzeugt jede Vergleichsoperation, bei der (mindestens) einer der Operanden ausgeführt wird, NULLden dritten logischen Wert - UNKNOWN( im Gegensatz zu TRUEund FALSE).
UNKNOWNWerte verbreiten sich durch alle kombinierenden booleschen Operatoren, wenn sie nicht bereits entschieden wurden (z. B. ANDmit einem FALSEOperanden oder ORmit einem TRUEOperanden) oder negations ( NOT).
Die WHEREKlausel wird verwendet, um die von der FROMKlausel erzeugte Ergebnismenge zu filtern , sodass der Gesamtwert der WHEREKlausel sein muss, TRUEdamit die Zeile nicht herausgefiltert wird. Wenn UNKNOWNalso durch einen Vergleich ein erzeugt wird, wird die Zeile herausgefiltert.
Die Antwort von @ user1227804 enthält dieses Zitat:
Wenn beide Seiten des Vergleichs Spalten oder zusammengesetzte Ausdrücke sind, wirkt sich die Einstellung nicht auf den Vergleich aus.
von *SET ANSI_NULLS
Ich bin mir jedoch nicht sicher, welchen Punkt es anstrebt, da beim NULLVergleich zweier Spalten (z. B. in a JOIN) der Vergleich immer noch fehlschlägt:
create table #T1 (
ID int not null,
Val1 varchar(10) null
)
insert into #T1(ID,Val1) select 1,null
create table #T2 (
ID int not null,
Val1 varchar(10) null
)
insert into #T2(ID,Val1) select 1,null
select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and t1.Val1 = t2.Val1
Die obige Abfrage gibt 0 Zeilen zurück, während:
select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and (t1.Val1 = t2.Val1 or t1.Val1 is null and t2.Val1 is null)
Gibt eine Zeile zurück. Selbst wenn beide Operanden Spalten sind, ist NULLdies nicht gleich NULL. Und die Dokumentation zu= hat nichts zu den Operanden zu sagen:
Wenn Sie zwei NULLAusdrücke vergleichen , hängt das Ergebnis von der ANSI_NULLSEinstellung ab:
Wenn auf ANSI_NULLSgesetzt ist, ONist das Ergebnis NULL1 , gemäß der ANSI-Konvention, dass ein NULL(oder unbekannter) Wert nicht gleich einem anderen NULLoder unbekannten Wert ist.
Wenn ANSI_NULLSfestgelegt ist OFF, das Ergebnis im NULLVergleich zu NULList TRUE.
Der Vergleich NULLmit einem Nichtwert NULLergibt immer FALSE2 .
Sowohl 1 als auch 2 sind jedoch falsch - das Ergebnis beider Vergleiche ist UNKNOWN.
* Die kryptische Bedeutung dieses Textes wurde Jahre später entdeckt. Was es tatsächlich bedeutet, ist, dass für diese Vergleiche die Einstellung keine Auswirkung hat und sich immer so verhält, als ob die Einstellung eingeschaltet wäre . Wäre klarer gewesen, wenn angegeben worden wäre, dass dies SET ANSI_NULLS OFFdie Einstellung war, die keinen Einfluss hatte.