SET ANSI_NULLS (Transact-SQL)

 

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 2016 ISO-konform verhalten müssen.

System_CAPS_ICON_important.jpg Wichtig


In einer späteren Version von SQL Server wird ANSI_NULLS immer auf ON festgelegt, und jede Anwendung, die für die Option explizit OFF festlegt, löst einen Fehler aus. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird.

Topic link icon Transact-SQL-Syntaxkonventionen

-- Syntax for SQL Server  
  
SET ANSI_NULLS { ON | OFF }  

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
SET ANSI_NULLS ON;  

Wenn SET ANSI_NULLS ist, gibt eine SELECT-Anweisung, die WHERE verwendet Column_name = NULL gibt&0; Zeilen, auch wenn null-Werte in Column_name. Eine SELECT-Anweisung, die WHERE verwendet Column_name <> NULL gibt&0; Zeilen, auch wenn Werte ungleich NULL in Column_name.

Wenn SET ANSI_NULLS auf OFF festgelegt ist, folgen die Vergleichsoperatoren Gleich (=) und Ungleich (<>) nicht dem ISO-Standard. Eine SELECT-Anweisung, die WHERE verwendet Column_name = NULL gibt die Zeilen, die null-Werte in Column_name. Eine SELECT-Anweisung, die WHERE verwendet Column_name <> NULL gibt die Zeilen, deren Werte ungleich NULL in der Spalte zurück. Darüber hinaus eine SELECT-Anweisung, die WHERE verwendet Column_name <> XYZ_value verwendet gibt alle Zeilen, die nicht XYZ_value verwendet und nicht NULL sind.

Wenn SET 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).

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.

SET ANSI_NULLS muss zum Ausführen von verteilten Abfragen auf ON festgelegt sein.

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

System_CAPS_ICON_note.jpg 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 sein, NUMERIC_ROUNDABORT jedoch auf OFF.

Die SQL Server Native Client ODBC-Treiber und SQL Server Native Client OLE DB-Anbieter für SQL Server automatisch ANSI_NULLS auf ON festgelegt, wenn eine Verbindung herstellen. 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, so ist SET ANSI_NULLS aktiviert.

Die Einstellung von SET ANSI_NULLS wird zur Ausführungszeit und nicht zur Analysezeit festgelegt.

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;  
  

Erfordert die Mitgliedschaft in der public-Rolle.

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

SET-Anweisungen (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)
= (Gleich) (Transact-SQL)
IF... ELSE (Transact-SQL)
< > (Ungleich) (Transact-SQL)
SET-Anweisungen (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
WOBEI (Transact-SQL)
WHILE (Transact-SQL)

Community-Beiträge

HINZUFÜGEN
Anzeigen: