Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Gibt das ISO-kompatible Verhalten der Operatoren Equals (=
) und Not Equal To (<>
) an, wenn sie mit NULL
Werten in SQL Server verwendet werden.
-
SET ANSI_NULLS ON
- Wertet sowohl{expression} = NULL
als{expression} <> NULL
auch so aus, alsFalse
ob der Wert des Werts{expression}
istNULL
. Dieses Verhalten ist ANSI-kompatibel. -
SET ANSI_NULLS OFF
- Wertet{expression} = NULL
alsTrue
und{expression} <> NULL
alsFalse
wäre der Wert des Werts{expression}
.NULL
Dieses Verhalten wird nicht empfohlen, da dieNULL
Werte nicht mithilfe=
und<>
Operatoren verglichen werden sollten.
Hinweis
SET ANSI_NULLS OFF
und die ANSI_NULLS OFF
Datenbankoption ist veraltet. Ab SQL Server 2017 (14.x) ist ANSI_NULLS immer auf EIN festgelegt. Als veraltet markierte Funktionen sollten in neuen Anwendungen nicht verwendet werden. Weitere Informationen finden Sie unter veraltete Datenbank-Engine Features in SQL Server 2017.
Transact-SQL-Syntaxkonventionen
Syntax
Syntax für SQL Server und serverlose SQL-Pools in Azure Synapse Analytics, Microsoft Fabric
SET ANSI_NULLS { ON | OFF }
Syntax für Azure Synapse Analytics und Analytics-Plattformsystem (PDW)
SET ANSI_NULLS ON
Hinweise
Wenn ANSI_NULLS
"ON" ist, gibt eine SELECT
Anweisung, die null Zeilen verwendet WHERE column_name = NULL
, auch wenn null Werte in column_name vorhanden sind. Eine SELECT
Anweisung, die Nullzeilen verwendet WHERE column_name <> NULL
, auch wenn in column_name nicht NULL-Werte vorhanden sind.
Wenn ANSI_NULLS deaktiviert ist, entsprechen die Operatoren Gleich (=
) und Ungleich gleich (<>
) nicht dem ISO-Standard. Eine SELECT
Anweisung, die die Zeilen verwendet WHERE column_name = NULL
, die Nullwerte in column_name enthalten. Eine SELECT
Anweisung, die verwendet wird, WHERE column_name <> NULL
gibt die Zeilen zurück, die keineNULL
Werte in der Spalte enthalten. Außerdem gibt eine SELECT
Anweisung, die alle Zeilen verwendet WHERE column_name <> XYZ_value
, die nicht XYZ_value sind und nicht NULL
.
Wenn ANSI_NULLS
aktiviert ist, werden alle Vergleiche mit einem NULL-Wert zu UNKNOWN ausgewertet. Wenn SET ANSI_NULLS
"AUS" ist, werden Vergleiche aller Daten mit einem NULL-Wert als WAHR ausgewertet, wenn der Datenwert ist NULL
. Wenn SET ANSI_NULLS
nicht angegeben, gilt die Einstellung der ANSI_NULLS
Option der aktuellen Datenbank. Weitere Informationen zur ANSI_NULLS
Datenbankoption finden Sie unter ALTER DATABASE (Transact-SQL).
In der folgenden Tabelle wird gezeigt, wie sich die Einstellung ANSI_NULLS
auf die Ergebnisse boolescher Ausdrücke mit Null- und Nicht-Null-Werten auswirkt.
Boolescher Ausdruck | SET ANSI_NULLS EIN | FESTLEGEN ANSI_NULLS AUS |
---|---|---|
NULL = NULL |
UNBEKANNT | true |
1 = NULL |
UNBEKANNT | FALSCH |
NULL <> NULL |
UNBEKANNT | FALSCH |
1 <> NULL |
UNBEKANNT | true |
NULL > NULL |
UNBEKANNT | UNBEKANNT |
1 > NULL |
UNBEKANNT | UNBEKANNT |
NULL IS NULL |
true | true |
1 IS NULL |
FALSCH | FALSCH |
NULL IS NOT NULL |
FALSCH | FALSCH |
1 IS NOT NULL |
true | true |
SET ANSI_NULLS ON
wirkt sich nur auf einen Vergleich aus, wenn einer der Operanden des Vergleichs entweder eine Variable oder ein Literal NULL
istNULL
. Falls beide Seiten des Vergleichs Spalten oder zusammengesetzte Ausdrücke sind, hat die Einstellung keine Auswirkungen auf den Vergleich.
Damit ein Skript wie beabsichtigt funktioniert, unabhängig von der ANSI_NULLS
Datenbankoption oder der Einstellung von SET ANSI_NULLS
, verwenden IS NULL
Sie und IS NOT NULL
in Vergleichen, die NULL-Werte enthalten können.
ANSI_NULLS
sollte für die Ausführung verteilter Abfragen auf "EIN" festgelegt werden.
ANSI_NULLS
muss auch AKTIVIERT sein, wenn Sie Indizes für berechnete Spalten oder indizierte Ansichten erstellen oder ändern. Wenn SET ANSI_NULLS deaktiviert ist, schlagen alle CREATE
, UPDATE
, , INSERT
und DELETE
Anweisungen für Tabellen mit Indizes für berechnete Spalten oder indizierte Ansichten fehl. SQL Server gibt einen Fehler zurück, der alle SET-Optionen auflistet, die gegen die erforderlichen Werte verstoßen. Wenn Sie eine SELECT
Anweisung ausführen, SET ANSI_NULLS
ignoriert SQL Server auch die Indexwerte für berechnete Spalten oder Ansichten und löst den Auswahlvorgang so aus, als ob in den Tabellen oder Ansichten keine solchen Indizes vorhanden wären.
Hinweis
ANSI_NULLS
ist eine von sieben SET-Optionen, die beim Umgang mit Indizes für berechnete Spalten oder indizierte Ansichten auf erforderliche Werte festgelegt werden müssen. Die Optionen ANSI_PADDING
, ANSI_WARNINGS
, ARITHABORT
, QUOTED_IDENTIFIER
und CONCAT_NULL_YIELDS_NULL
müssen ebenfalls auf ON festgelegt werden, und NUMERIC_ROUNDABORT
muss auf OFF festgelegt werden.
Der SQL Server Native Client ODBC-Treiber und der OLE DB-Anbieter für SQL Server nativer Client für SQL Server werden beim Herstellen einer Verbindung automatisch auf EIN festgelegt ANSI_NULLS
. Diese Einstellung kann in ODBC-Datenquellen, in ODBC-Verbindungsattributen oder in OLE DB-Verbindungseigenschaften konfiguriert werden, die in der Anwendung festgelegt werden, bevor die Verbindung mit einer Instanz von SQL Server hergestellt wird. Der Standardwert SET ANSI_NULLS
ist OFF.
Wenn ANSI_DEFAULTS
aktiviert ist, ANSI_NULLS
ist diese Option aktiviert.
Die Einstellung wird ANSI_NULLS
zur Ausführung oder Laufzeit definiert und nicht zur Analysezeit.
Um die aktuelle Einstellung anzuzeigen, führen Sie die folgende Abfrage aus:
DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';
SELECT @ANSI_NULLS AS ANSI_NULLS;
Berechtigungen
Erfordert die Mitgliedschaft in der public -Rolle.
Beispiele
Im folgenden Beispiel werden die Operatoren Equals (=
) und Not Equal To (<>
) verwendet, um Vergleiche mit NULL
oder 0
und dem null
Wert in einer Variablen vorzunehmen.
SET ANSI_NULLS OFF
DECLARE @var INT = NULL
SELECT
IIF(@var = NULL, 'True', 'False') as EqualNull,
IIF(@var <> NULL, 'True', 'False') as DifferentNull,
IIF(@var = 0, 'True', 'False') as EqualZero,
IIF(@var <> 0, 'True', 'False') as DifferentZero
Die Ergebnisse werden in der folgenden Tabelle angezeigt.
EqualNull | DifferentNull | EqualZero | DifferentZero |
---|---|---|---|
Richtig | Falsch | Falsch | Richtig |
Bei SET ANSI_NULLS ON
allen Ausdrücken würde 'False' ausgewertet, da NULL
sie nicht mit NULL
diesen Operatoren verglichen oder 0
verwendet werden können.
Im folgenden Beispiel werden mithilfe der Vergleichsoperatoren Gleich (=
) und Ungleich (<>
) Vergleiche mit NULL
-Werten und mit Werten ungleich NULL in einer Tabelle ausgeführt. Das Beispiel zeigt auch, dass sich die SET ANSI_NULLS
Einstellung nicht auf die Einstellung auswirkt IS NULL
.
-- Create table t1 and insert values.
CREATE TABLE dbo.t1 (a INT NULL);
INSERT INTO dbo.t1 values (NULL),(0),(1);
GO
-- Print message and perform SELECT statements.
PRINT 'Testing default setting';
DECLARE @varname int;
SET @varname = NULL;
SELECT a
FROM t1
WHERE a = @varname;
SELECT a
FROM t1
WHERE a <> @varname;
SELECT a
FROM t1
WHERE a IS NULL;
GO
Legen Sie ANSI_NULLS jetzt auf ON fest, und führen Sie einen Test durch.
PRINT 'Testing ANSI_NULLS ON';
SET ANSI_NULLS ON;
GO
DECLARE @varname int;
SET @varname = NULL
SELECT a
FROM t1
WHERE a = @varname;
SELECT a
FROM t1
WHERE a <> @varname;
SELECT a
FROM t1
WHERE a IS NULL;
GO
Legen Sie ANSI_NULLS jetzt auf OFF fest, und führen Sie einen Test durch.
PRINT 'Testing ANSI_NULLS OFF';
SET ANSI_NULLS OFF;
GO
DECLARE @varname int;
SET @varname = NULL;
SELECT a
FROM t1
WHERE a = @varname;
SELECT a
FROM t1
WHERE a <> @varname;
SELECT a
FROM t1
WHERE a IS NULL;
GO
-- Drop table t1.
DROP TABLE dbo.t1;