Freigeben über


SET ANSI_NULLS (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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, als False ob der Wert des Werts {expression} ist NULL. Dieses Verhalten ist ANSI-kompatibel.
  • SET ANSI_NULLS OFF- Wertet {expression} = NULL als True und {expression} <> NULL als False wäre der Wert des Werts {expression} .NULL Dieses Verhalten wird nicht empfohlen, da die NULL 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 ONwirkt sich nur auf einen Vergleich aus, wenn einer der Operanden des Vergleichs entweder eine Variable oder ein Literal NULListNULL. 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, , INSERTund 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;