SET ANSI_NULLS (Transact-SQL)
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.
Hinweis
SET ANSI_NULLS OFF
und die Option ANSI_NULLS OFF-Datenbank 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 EIN 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 null Zeilen 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 aufweisen. Eine SELECT-Anweisung, die die Zeilen verwendet WHERE column_name <> NULL
, die nicht NULL-Werte in der Spalte enthalten. Außerdem gibt WHERE column_name <> XYZ_value
eine SELECT-Anweisung, die alle Zeilen verwendet, die nicht XYZ_value sind und nicht NULL sind.
Wenn ANSI_NULLS auf ON festgelegt ist, werden alle Vergleiche mit einem NULL-Wert zu UNKNOWN ausgewertet. Wenn SET ANSI_NULLS auf OFF festgelegt ist, werden alle Datenvergleiche mit einem NULL-Wert zu TRUE ausgewertet, falls der Datenwert NULL ist. Falls SET ANSI_NULLS nicht angegeben ist, gilt die Einstellung der Option ANSI_NULLS der aktuellen Datenbank. Weitere Informationen zur Datenbankoption ANSI_NULLS finden Sie unter ALTER DATABASE (Transact-SQL).
Die folgende Tabelle stellt dar, wie die Einstellung von ANSI_NULLS die Ergebnisse mehrerer boolescher Ausdrücke mithilfe von NULL-Werten und Werten ungleich NULL beeinflusst.
Boolescher Ausdruck | SET ANSI_NULLS EIN | FESTLEGEN ANSI_NULLS AUS |
---|---|---|
NULL = NULL |
UNKNOWN | true |
1 = NULL |
UNKNOWN | FALSE |
NULL <> NULL |
UNKNOWN | FALSE |
1 <> NULL |
UNKNOWN | true |
NULL > NULL |
UNKNOWN | UNKNOWN |
1 > NULL |
UNKNOWN | UNKNOWN |
NULL IS NULL |
TRUE | TRUE |
1 IS NULL |
false | false |
NULL IS NOT NULL |
false | false |
1 IS NOT NULL |
TRUE | TRUE |
SET ANSI_NULLS ON hat nur dann Auswirkungen auf einen Vergleich, wenn einer der Operanden des Vergleichs entweder eine Variable, die NULL ist, oder ein Literal NULL ist. Falls beide Seiten des Vergleichs Spalten oder zusammengesetzte Ausdrücke sind, hat die Einstellung keine Auswirkungen auf den Vergleich.
Ein Skript wird unabhängig von der Datenbankoption ANSI_NULLS und der Einstellung von SET ANSI_NULLS wie beabsichtigt ausgeführt, wenn Sie IS NULL und IS NOT NULL in Vergleichen verwenden, die möglicherweise NULL-Werte enthalten.
ANSI_NULLS muss zum Ausführen von verteilten Abfragen auf ON festgelegt sein.
ANSI_NULLS muss auch beim Erstellen oder Ändern von Indizes für berechnete Spalten oder indizierte Sichten auf ON festgelegt sein. Wenn SET ANSI_NULLS auf OFF festgelegt ist, schlagen die CREATE-, UPDATE-, INSERT- und DELETE-Anweisungen in Tabellen mit Indizes auf berechneten Spalten oder indizierten Sichten fehl. SQL Server gibt einen Fehler zurück, der alle SET-Optionen auflistet, die gegen die erforderlichen Werte verstoßen. Wenn SET ANSI_NULLS auf OFF festgelegt ist, ignoriert SQL Server beim Ausführen einer SELECT-Anweisung die Indexwerte für berechnete Spalten oder Sichten und löst den SELECT-Vorgang so auf, als seien keine derartigen Indizes für die Tabelle oder Sicht vorhanden.
Hinweis
ANSI_NULLS ist eine der sieben SET-Optionen, für die bestimmte Werte beim Verwenden von Indizes auf berechneten Spalten oder indizierten Sichten festgelegt sein 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 ODBC-Treiber von SQL Server Native Client und der OLE DB-Anbieter von SQL Server Native Client für SQL Server legen ANSI_NULLS beim Herstellen einer Verbindung automatisch auf ON fest. 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. Die Standardeinstellung für SET ANSI_NULLS ist OFF.
Ist SET ANSI_DEFAULTS auf ON festgelegt, ist ANSI_NULLS aktiviert.
Die Einstellung von ANSI_NULLS wird zur Ausführungs- bzw. Laufzeit und nicht zur Analysezeit definiert.
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 mithilfe der Vergleichsoperatoren Gleich (=
) und Ungleich (<>
) Vergleiche mit NULL
-Werten und mit Werten ungleich NULL in einer Tabelle ausgeführt. Das Beispiel zeigt ebenfalls, dass IS NULL
durch die SET ANSI_NULLS
-Einstellung nicht beeinflusst wird.
-- 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;