In SQL Server ist der ANSI_NULLS
Mit der Einstellung können Sie angeben, wie NULL
Werte werden in Abfragen behandelt.
Genauer gesagt ermöglicht es Ihnen, das ISO-konforme Verhalten von Equals (=
) und Ungleich (<>
) Vergleichsoperatoren, wenn sie mit NULL
verwendet werden Werte.
ANSI_NULLS
kann auf ON
gesetzt werden oder OFF
. Ein NULL
Test, der true mit ANSI_NULLS OFF
zurückgibt könnte mit ANSI_NULLS ON
tatsächlich false zurückgeben .
Dies kann die Ursache für viel Verwirrung sein, und daher lohnt es sich, genau zu verstehen, wie ANSI_NULLS
funktioniert.
ANSI_NULLS
Einstellungen können auf Datenbankebene und auf Sitzungsebene festgelegt werden. Wenn ein ANSI_NULLS
Einstellung auf Sitzungsebene nicht angegeben ist, verwendet SQL Server den ANSI_NULLS
Die Einstellung wird auf die aktuelle Datenbank angewendet. Daher können Sie beim Schreiben von Ad-hoc-Abfragen die Datenbankeinstellung mit Ihrer eigenen Einstellung auf Sitzungsebene überschreiben.
Beachten Sie unbedingt, dass der SQL Server Native Client-ODBC-Treiber und der SQL Server Native Client-OLE DB-Anbieter für SQL Server automatisch ANSI_NULLS
festlegen auf ON
beim Verbinden. Diese Einstellung kann in ODBC-Datenquellen, in ODBC-Verbindungsattributen oder in OLE DB-Verbindungseigenschaften konfiguriert werden, die in der Anwendung festgelegt werden, bevor eine Verbindung mit einer Instanz von SQL Server hergestellt wird.
So überprüfen Sie die ANSI_NULLS-Einstellung Ihrer Sitzung
Sie können die SESSIONPROPERTY()
verwenden Funktion, um die ANSI_NULLS
zu überprüfen Einstellung für die aktuelle Sitzung.
SELECT SESSIONPROPERTY('ANSI_NULLS');
Ergebnis:
+--------------------+ | (No column name) | |--------------------| | 1 | +--------------------+
In diesem Fall der ANSI_NULLS
Einstellung für meine Sitzung ist ON
.
Eine Null (0
) würde bedeuten, dass es ausgeschaltet ist.
So ändern Sie die ANSI_NULLS-Einstellung Ihrer Sitzung
Sie können die ANSI_NULLS-Einstellung Ihrer Sitzung auf OFF
setzen mit folgendem Code:
SET ANSI_NULLS OFF;
Eine erneute Überprüfung ergibt eine Null.
SELECT SESSIONPROPERTY('ANSI_NULLS');
Ergebnis:
+--------------------+ | (No column name) | |--------------------| | 0 | +--------------------+
Der Standardwert für SET ANSI_NULLS
ist OFF
. Wie oben erwähnt, legen der SQL Server Native Client-ODBC-Treiber und der SQL Server Native Client-OLE DB-Anbieter für SQL Server jedoch automatisch ANSI_NULLS
fest auf ON
beim Verbinden.
Beispiele dafür, wie ANSI_NULLS
Betrifft Abfragen
Hier sind einige grundlegende Beispiele, um die unterschiedlichen Ergebnisse zu demonstrieren, die Sie abhängig vom Wert von ANSI_NULLS
erhalten können Einstellung.
Diese verwenden SET ANSI_NULLS
um die ANSI_NULLS
umzuschalten Einstellung für die aktuelle Sitzung.
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
Ergebnis:
(0 rows affected)
Wenn ANSI_NULLS
ist ON
, alle Vergleiche gegen NULL
Wert zu UNKNOWN
auswerten .
In diesem Fall können wir nicht wirklich sagen, dass NULL
ist gleich NULL
weil jeder Wert unbekannt ist.
Daher werden für die obige Abfrage keine Zeilen zurückgegeben.
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
Ergebnis:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+
Wenn ANSI_NULLS
ist OFF
, Vergleiche aller Daten mit einem NULL
Wert auf TRUE
auswerten wenn der Datenwert NULL
ist .
Dieselbe Logik gilt bei Verwendung des Ungleich-Operators (<>
).
Erweitern wir das Beispiel um den Ungleich-Operator (<>
), sowie einen Vergleich zwischen NULL
und ein Nicht-NULL
Wert.
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL;
Ergebnis:
(0 rows affected) (0 rows affected) (0 rows affected) (0 rows affected)
Wie erwartet werden für keine der Abfragen Zeilen zurückgegeben. Das liegt daran, dass NULL
Werte werden als UNKNOWN
behandelt Wert bei ANSI_NULLS
ist ON
.
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL;
Ergebnis:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
Wir erhalten ein anderes Ergebnis, wenn ANSI_NULLS
ist OFF
.
In diesem Fall behandelt SQL Server NULL
nicht als UNKNOWN
. Es bestimmt, dass NULL
ist tatsächlich gleich NULL
.
Dies entspricht nicht dem ANSI-Standard.
Der IS NULL
Prädikat
Damit ein Skript wie beabsichtigt funktioniert, unabhängig von ANSI_NULLS
Datenbankoption oder die Einstellung von SET ANSI_NULLS
, verwenden Sie IS NULL
und IS NOT NULL
in Vergleichen, die Nullwerte enthalten könnten
Folgendes passiert, wenn wir das vorherige Beispiel so umschreiben, dass es IS NULL
verwendet und IS NOT NULL
.
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL;
Ergebnis:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL;
Ergebnis:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
Wie erwartet erhalten wir unabhängig von ANSI_NULLS
dasselbe Ergebnis Einstellung.
Vergleichstabelle
Die folgende Tabelle zeigt die Variationen, die Sie abhängig vom booleschen Ausdruck und ANSI_NULLS
erhalten können Einstellung.
Boolescher Ausdruck | ANSI_NULLS EINSTELLEN | ANSI_NULLS AUSSTELLEN |
---|---|---|
NULL =NULL | UNBEKANNT | WAHR |
1 =NULL | UNBEKANNT | FALSCH |
NULL <> NULL | UNBEKANNT | FALSCH |
1 <> NULL | UNBEKANNT | WAHR |
NULL> NULL | UNBEKANNT | UNBEKANNT |
1> NULL | UNBEKANNT | UNBEKANNT |
NULL IST NULL | WAHR | WAHR |
1 IST NULL | FALSCH | FALSCH |
NULL IST NICHT NULL | FALSCH | FALSCH |
1 IST NICHT NULL | WAHR | WAHR |
Festlegen von ANSI_NULLS auf Datenbankebene
Jede SQL Server-Datenbank hat einen ANSI_NULLS
Einstellung, die bestimmt, wie Vergleiche mit NULL
durchgeführt werden Werte ausgewertet werden.
- Bei Einstellung auf
ON
, Vergleiche mitNULL
Wert zuUNKNOWN
auswerten . - Bei Einstellung auf
OFF
, Vergleiche von Nicht-Unicode-Werten mit einemNULL
Wert aufTRUE
auswerten wenn beide WerteNULL
sind .
Sie können diese Einstellung in einer Datenbank mit dem folgenden Code ändern:
ALTER DATABASE CURRENT
SET ANSI_NULLS ON;
Das setzt ANSI_NULLS
auf ON
für die aktuelle Datenbank. Sie können CURRENT
tauschen mit dem Namen einer Datenbank, falls bevorzugt.
Sie können die aktuelle Einstellung mit DATABASEPROPERTYEX()
überprüfen Funktion.
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullsEnabled');
Ergebnis:
1
Wie bereits erwähnt, können Sie diese Einstellung beim Schreiben von Ad-hoc-Abfragen überschreiben, indem Sie sie wie zuvor auf Sitzungsebene festlegen.
Wo wir gerade beim Thema sind, sollte ich erwähnen, dass SQL Server-Datenbanken auch einen ANSI_NULL_DEFAULT
haben Einstellung. Diese Einstellung bestimmt den Standardwert NULL
oder NOT NULL
, eines Spalten- oder CLR-benutzerdefinierten Typs, für den die NULL-Zulässigkeit nicht explizit in CREATE TABLE
definiert ist oder ALTER TABLE
Aussagen.
Dieser Wert kann wie folgt eingestellt werden:
ALTER DATABASE CURRENT
SET ANSI_NULL_DEFAULT ON;
Sein Wert kann wie folgt abgerufen werden:
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullDefault');
Ergebnis:
1
Sie können auch die sys.databases
verwenden Katalogansicht, um diese Einstellungen für alle Datenbanken zurückzugeben.
SELECT
name,
is_ansi_nulls_on,
is_ansi_null_default_on
FROM sys.databases
ORDER BY name ASC;