SET ANSI_NULLS (Transact-SQL)SET ANSI_NULLS (Transact-SQL)

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)neinAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Gibt an, dass sich die Vergleichsoperatoren Gleich (=) und Ungleich (<>) bei Verwendung mit NULL-Werten in SQL Server 2017SQL Server 2017 ISO-konform verhalten müssen.Specifies ISO compliant behavior of the Equals (=) and Not Equal To (<>) comparison operators when they are used with null values in SQL Server 2017SQL Server 2017.

Wichtig

In einer späteren Version von SQL ServerSQL Server wird ANSI_NULLS auf ON festgelegt, und jede Anwendung, die für die Option explizit OFF festlegt, löst einen Fehler aus.In a future version of SQL ServerSQL Server, ANSI_NULLS will be ON and any applications that explicitly set the option to OFF will generate an error. Nutzen Sie diese Funktionen bei Neuentwicklungen nicht mehr, und planen Sie die Änderung von Anwendungen, die diese Funktion zurzeit verwenden.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- Syntax for SQL Server

SET ANSI_NULLS { ON | OFF }
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

SET ANSI_NULLS ON

RemarksRemarks

Wenn SET ANSI_NULLS auf ON festgelegt ist, gibt eine SELECT-Anweisung, in der WHERE column_name = NULL verwendet wird, auch dann 0 Zeilen zurück, wenn sich NULL-Werte in column_name befinden.When SET ANSI_NULLS is ON, a SELECT statement that uses WHERE column_name = NULL returns zero rows even if there are null values in column_name. Eine SELECT-Anweisung, die WHERE column_name <> NULL verwendet, gibt auch dann 0 Zeilen zurück, wenn sich Werte ungleich NULL in column_name befinden.A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are nonnull values in column_name.

Wenn SET ANSI_NULLS auf OFF festgelegt ist, folgen die Vergleichsoperatoren Gleich (=) und Ungleich (<>) nicht dem ISO-Standard.When SET ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard. Eine SELECT-Anweisung, in der WHERE column_name = NULL verwendet wird, gibt die Zeilen zurück, die NULL-Werte in column_name enthalten.A SELECT statement that uses WHERE column_name = NULL returns the rows that have null values in column_name. Eine SELECT-Anweisung, die WHERE column_name <> NULL verwendet, gibt die Zeilen mit Werten ungleich NULL in der Spalte zurück.A SELECT statement that uses WHERE column_name <> NULL returns the rows that have nonnull values in the column. Außerdem gibt eine SELECT-Anweisung, in der column_name <> XYZ_value verwendet wird, alle Zeilen zurück, die nicht gleich XYZ_value und nicht NULL sind.Also, a SELECT statement that uses WHERE column_name <> XYZ_value returns all rows that are not XYZ_value and that are not NULL.

Wenn SET ANSI_NULLS auf ON festgelegt ist, werden alle Vergleiche mit einem NULL-Wert zu UNKNOWN ausgewertet.When SET ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN. Wenn SET ANSI_NULLS auf OFF festgelegt ist, werden alle Datenvergleiche mit einem NULL-Wert zu TRUE ausgewertet, falls der Datenwert NULL ist.When SET ANSI_NULLS is OFF, comparisons of all data against a null value evaluate to TRUE if the data value is NULL. Falls SET ANSI_NULLS nicht angegeben ist, gilt die Einstellung der Option ANSI_NULLS der aktuellen Datenbank.If SET ANSI_NULLS is not specified, the setting of the ANSI_NULLS option of the current database applies. Weitere Informationen zur Datenbankoption ANSI_NULLS finden Sie unter ALTER DATABASE (Transact-SQL).For more information about the ANSI_NULLS database option, see 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.The following table shows how the setting of ANSI_NULLS affects the results of a number of Boolean expressions using null and non-null values.

Boolescher AusdruckBoolean Expression SET ANSI_NULLS ONSET ANSI_NULLS ON SET ANSI_NULLS OFFSET ANSI_NULLS OFF
NULL = NULLNULL = NULL UNKNOWNUNKNOWN TRUETRUE
1 = NULL1 = NULL UNKNOWNUNKNOWN FALSEFALSE
NULL <> NULLNULL <> NULL UNKNOWNUNKNOWN FALSEFALSE
1 <> NULL1 <> NULL UNKNOWNUNKNOWN TRUETRUE
NULL > NULLNULL > NULL UNKNOWNUNKNOWN UNKNOWNUNKNOWN
1 > NULL1 > NULL UNKNOWNUNKNOWN UNKNOWNUNKNOWN
NULL IS NULLNULL IS NULL TRUETRUE TRUETRUE
1 IS NULL1 IS NULL FALSEFALSE FALSEFALSE
NULL IS NOT NULLNULL IS NOT NULL FALSEFALSE FALSEFALSE
1 IS NOT NULL1 IS NOT NULL TRUETRUE TRUETRUE

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.SET ANSI_NULLS ON affects a comparison only if one of the operands of the comparison is either a variable that is NULL or a literal NULL. Falls beide Seiten des Vergleichs Spalten oder zusammengesetzte Ausdrücke sind, hat die Einstellung keine Auswirkungen auf den Vergleich.If both sides of the comparison are columns or compound expressions, the setting does not affect the comparison.

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.For a script to work as intended, regardless of the ANSI_NULLS database option or the setting of SET ANSI_NULLS, use IS NULL and IS NOT NULL in comparisons that might contain null values.

SET ANSI_NULLS muss zum Ausführen von verteilten Abfragen auf ON festgelegt sein.SET ANSI_NULLS should be set to ON for executing distributed queries.

SET ANSI_NULLS muss auch beim Erstellen oder Ändern von Indizes für berechnete Spalten oder indizierte Sichten auf ON festgelegt sein.SET ANSI_NULLS must also be ON when you are creating or changing indexes on computed columns or indexed views. 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.If SET ANSI_NULLS is OFF, any CREATE, UPDATE, INSERT, and DELETE statements on tables with indexes on computed columns or indexed views will fail. SQL ServerSQL Server gibt einen Fehler zurück, der alle SET-Optionen auflistet, die gegen die erforderlichen Werte verstoßen. returns an error that lists all SET options that violate the required values. Wenn SET ANSI_NULLS auf OFF festgelegt ist, ignoriert SQL ServerSQL 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.Also, when you execute a SELECT statement, if SET ANSI_NULLS is OFF, SQL ServerSQL Server ignores the index values on computed columns or views and resolve the select operation as if there were no such indexes on the tables or views.

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.ANSI_NULLS is one of seven SET options that must be set to required values when dealing with indexes on computed columns or indexed views. Die Optionen ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, QUOTED_IDENTIFIER und CONCAT_NULL_YIELDS_NULL müssen ebenfalls auf ON festgelegt sein, NUMERIC_ROUNDABORT jedoch auf OFF.The options ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, QUOTED_IDENTIFIER, and CONCAT_NULL_YIELDS_NULL must also be set to ON, and NUMERIC_ROUNDABORT must be set to OFF.

Der ODBC-Treiber von SQL ServerSQL Server Native Client und der OLE DB-Anbieter von SQL ServerSQL Server Native Client für SQL ServerSQL Server legen ANSI_NULLS beim Herstellen einer Verbindung automatisch auf ON fest.The SQL ServerSQL Server Native Client ODBC driver and SQL ServerSQL Server Native Client OLE DB Provider for SQL ServerSQL Server automatically set ANSI_NULLS to ON when connecting. 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 ServerSQL Server hergestellt wird.This setting can be configured in ODBC data sources, in ODBC connection attributes, or in OLE DB connection properties that are set in the application before connecting to an instance of SQL ServerSQL Server. Die Standardeinstellung für SET ANSI_NULLS ist OFF.The default for SET ANSI_NULLS is OFF.

Ist SET ANSI_DEFAULTS auf ON festgelegt, so ist SET ANSI_NULLS aktiviert.When SET ANSI_DEFAULTS is ON, SET ANSI_NULLS is enabled.

Die Einstellung von SET ANSI_NULLS wird zur Ausführungszeit und nicht zur Analysezeit festgelegt.The setting of SET ANSI_NULLS is set at execute or run time and not at parse time.

Um die aktuelle Einstellung anzuzeigen, führen Sie die folgende Abfrage aus:To view the current setting for this setting, run the following query:

DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';  
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';  
SELECT @ANSI_NULLS AS ANSI_NULLS;  

BerechtigungenPermissions

Erfordert die Mitgliedschaft in der public-Rolle.Requires membership in the public role.

BeispieleExamples

Im folgenden Beispiel werden mithilfe der Vergleichsoperatoren Gleich (=) und Ungleich (<>) Vergleiche mit NULL-Werten und mit Werten ungleich NULL in einer Tabelle ausgeführt.The following example uses the Equals (=) and Not Equal To (<>) comparison operators to make comparisons with NULL and nonnull values in a table. Das Beispiel zeigt ebenfalls, dass IS NULL durch die SET ANSI_NULLS-Einstellung nicht beeinflusst wird.The example also shows that IS NULL is not affected by the SET ANSI_NULLS setting.

-- 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  

-- SET ANSI_NULLS to ON and test.  
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  

-- SET ANSI_NULLS to OFF and test.  
PRINT 'Testing SET 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;  

Weitere Informationen finden Sie unterSee Also

SET-Anweisungen (Transact-SQL) SET Statements (Transact-SQL)
SESSIONPROPERTY (Transact-SQL) SESSIONPROPERTY (Transact-SQL)
= (Equals) (Transact-SQL) (= (ist gleich) (Transact-SQL)) = (Equals) (Transact-SQL)
IF...ELSE (Transact-SQL) IF...ELSE (Transact-SQL)
<> (Ungleich) (Transact-SQL) <> (Not Equal To) (Transact-SQL)
SET-Anweisungen (Transact-SQL) SET Statements (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL) SET ANSI_DEFAULTS (Transact-SQL)
WHERE (Transact-SQL) WHERE (Transact-SQL)
WHILE (Transact-SQL)WHILE (Transact-SQL)