Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server ANSI_NULLS erklärt

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 mit NULL Wert zu UNKNOWN auswerten .
  • Bei Einstellung auf OFF , Vergleiche von Nicht-Unicode-Werten mit einem NULL Wert auf TRUE auswerten wenn beide Werte NULL 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;