Delen via


STEL ANSI_NULLS (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Hiermee geeft u iso-compatibel gedrag van de vergelijkingsoperators Equals (=) en Not Equal To (<>) op wanneer ze worden gebruikt met NULL waarden in SQL Server.

  • SET ANSI_NULLS ON - Evalueert zowel {expression} = NULL als {expression} <> NULLFalse alsof de waarde {expression} is NULL. Dit gedrag is compatibel met ANSI.
  • SET ANSI_NULLS OFF - Evalueert {expression} = NULL als True en {expression} <> NULL alsof False de waarde {expression} is NULL. Dit gedrag wordt niet aanbevolen, omdat de NULL waarden niet moeten worden vergeleken met behulp van = en <> operators.

Opmerking

SET ANSI_NULLS OFF en de ANSI_NULLS OFF databaseoptie is afgeschaft. Vanaf SQL Server 2017 (14.x) is ANSI_NULLS altijd ingesteld op AAN. Afgeschafte functies mogen niet worden gebruikt in nieuwe toepassingen. Zie Afgeschafte database-enginefuncties in SQL Server 2017 voor meer informatie.

Transact-SQL syntaxis-conventies

Syntaxis

Syntaxis voor SQL Server, serverloze SQL-pool in Azure Synapse Analytics, Microsoft Fabric

SET ANSI_NULLS { ON | OFF }

Syntaxis voor Azure Synapse Analytics en Analytics Platform System (PDW)

SET ANSI_NULLS ON

Opmerkingen

Wanneer ANSI_NULLS is INGESCHAKELD, retourneert een SELECT instructie die WHERE column_name = NULL nul rijen retourneert, zelfs als er NULL-waarden in column_name zijn. Een SELECT instructie die gebruikmaakt WHERE column_name <> NULL van retourneert nul rijen, zelfs als er niet-NULL-waarden zijn in column_name.

Wanneer ANSI_NULLS UIT is, voldoen de vergelijkingsoperatoren Gelijk aan (=) en Niet gelijk aan (<>) niet aan de ISO-norm. Een SELECT instructie die gebruikmaakt WHERE column_name = NULL , retourneert de rijen met null-waarden in column_name. Een SELECT instructie die gebruikmaakt WHERE column_name <> NULL , retourneert de rijen met niet-waardenNULL in de kolom. Ook retourneert een SELECT instructie die alle WHERE column_name <> XYZ_value rijen retourneert die niet XYZ_value zijn en die niet NULLzijn.

Wanneer ANSI_NULLS is INGESCHAKELD, worden alle vergelijkingen met een null-waarde geëvalueerd als ONBEKEND. Wanneer SET ANSI_NULLS is UIT, worden alle gegevens vergeleken met een null-waarde als WAAR als de gegevenswaarde is NULL. Als SET ANSI_NULLS dit niet is opgegeven, is de instelling van de optie van de ANSI_NULLS huidige database van toepassing. Zie ANSI_NULLS voor meer informatie over de databaseoptie.

In de volgende tabel ziet u hoe de instelling ANSI_NULLS van invloed is op de resultaten van Boole-expressies met behulp van null- en niet-null-waarden.

Booleaanse expressie ANSI_NULLS INSTELLEN AAN ANSI_NULLS UITZETTEN
NULL = NULL ONBEKEND WAAR
1 = NULL ONBEKEND ONWAAR
NULL <> NULL ONBEKEND ONWAAR
1 <> NULL ONBEKEND WAAR
NULL > NULL ONBEKEND ONBEKEND
1 > NULL ONBEKEND ONBEKEND
NULL IS NULL WAAR WAAR
1 IS NULL ONWAAR ONWAAR
NULL IS NOT NULL ONWAAR ONWAAR
1 IS NOT NULL WAAR WAAR

SET ANSI_NULLS ON is slechts van invloed op een vergelijking als een van de operanden van de vergelijking een variabele is die of NULL een letterlijke variabele NULLis. Als beide zijden van de vergelijking kolommen of samengestelde expressies zijn, heeft de instelling geen invloed op de vergelijking.

Een script werkt naar behoren, ongeacht de ANSI_NULLS databaseoptie of de instelling van SET ANSI_NULLS, gebruik IS NULL en IS NOT NULL in vergelijkingen die null-waarden kunnen bevatten.

ANSI_NULLS moet worden ingesteld op AAN voor het uitvoeren van gedistribueerde query's.

ANSI_NULLS moet ook AAN zijn wanneer u indexen maakt of wijzigt voor berekende kolommen of geïndexeerde weergaven. Als SET-ANSI_NULLS UIT is, een of CREATEmeer UPDATE, INSERTen DELETE instructies voor tabellen met indexen voor berekende kolommen of geïndexeerde weergaven mislukken. SQL Server retourneert een fout met alle SET-opties die de vereiste waarden schenden. Wanneer u een SELECT instructie uitvoert, worden SET ANSI_NULLS de indexwaarden in berekende kolommen of weergaven door SQL Server genegeerd en wordt de selectiebewerking omgezet alsof er geen dergelijke indexen in de tabellen of weergaven zijn.

Opmerking

ANSI_NULLS is een van de zeven SET-opties die moeten worden ingesteld op vereiste waarden bij het verwerken van indexen in berekende kolommen of geïndexeerde weergaven. De optiesANSI_PADDING, ANSI_WARNINGS, , ARITHABORTen QUOTED_IDENTIFIERCONCAT_NULL_YIELDS_NULL moeten ook worden ingesteld op AAN en NUMERIC_ROUNDABORT moeten worden ingesteld op UIT.

Het ODBC-stuurprogramma van sql Server Native Client en de OLE DB-provider van SQL Server voor SQL Server worden automatisch ingesteld ANSI_NULLS op AAN wanneer er verbinding wordt gemaakt. Deze instelling kan worden geconfigureerd in ODBC-gegevensbronnen, in ODBC-verbindingskenmerken of in OLE DB-verbindingseigenschappen die zijn ingesteld in de toepassing voordat u verbinding maakt met een exemplaar van SQL Server. De standaardwaarde SET ANSI_NULLS is UIT.

Wanneer ANSI_DEFAULTS is INGESCHAKELD, ANSI_NULLS is ingeschakeld.

De instelling ANSI_NULLS wordt gedefinieerd tijdens het uitvoeren of uitvoeren en niet op parseringstijd.

Voer de volgende query uit om de huidige instelling voor deze instelling weer te geven:

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

Machtigingen

Vereist lidmaatschap van de openbare rol.

Voorbeelden

In het volgende voorbeeld worden de vergelijkingsoperatoren Equals (=) en Not Equal To (<>) gebruikt om vergelijkingen te maken met NULL of 0 en de null waarde in een variabele.

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

De resultaten worden weergegeven in de volgende tabel.

EqualNull DifferentNull Gelijk Nul DifferentZero
Klopt Onwaar Onwaar Klopt

Alle SET ANSI_NULLS ON expressies worden geëvalueerd als Onwaar, omdat NULL deze operatoren niet kunnen worden vergeleken of NULL0 gebruikt.

In het volgende voorbeeld worden de vergelijkingsoperatoren Equals (=) en Not Equal To (<>) gebruikt om vergelijkingen te maken met NULL en niet-null-waarden in een tabel. In het voorbeeld ziet u ook dat de SET ANSI_NULLS instelling niet van invloed is 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 

Stel nu ANSI_NULLS in op AAN en 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  

Stel nu ANSI_NULLS in op UIT en test.

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;