Dela via


SET ANSI_NULLS (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Anger ISO-kompatibelt beteende för jämförelseoperatorerna Equals (=) och Not Equal To (<>) när de används med NULL värden i SQL Server.

  • SET ANSI_NULLS ON – Utvärderar både {expression} = NULL och {expression} <> NULL som False om värdet {expression} för är NULL. Det här beteendet är ANSI-kompatibelt.
  • SET ANSI_NULLS OFF – Utvärderar {expression} = NULL som True och {expression} <> NULL som False om värdet {expression} för är NULL. Det här beteendet rekommenderas inte eftersom NULL värdena inte ska jämföras med användning = och <> operatorer.

Anmärkning

SET ANSI_NULLS OFF och databasalternativet ANSI_NULLS OFF är inaktuellt. Från och med SQL Server 2017 (14.x) är ANSI_NULLS alltid inställt på PÅ. Inaktuella funktioner bör inte användas i nya program. Mer information finns i Inaktuella databasmotorfunktioner i SQL Server 2017.

Transact-SQL syntaxkonventioner

Syntax

Syntax för SQL Server, serverlös SQL-pool i Azure Synapse Analytics, Microsoft Fabric

SET ANSI_NULLS { ON | OFF }

Syntax för Azure Synapse Analytics and Analytics Platform System (PDW)

SET ANSI_NULLS ON

Anmärkningar

När ANSI_NULLS är PÅ returnerar en SELECT instruktion som använder WHERE column_name = NULL noll rader även om det finns NULL-värden i column_name. En SELECT instruktion som använder WHERE column_name <> NULL returnerar noll rader även om det finns icke-NULL-värden i column_name.

När ANSI_NULLS är AV följer jämförelseoperatorerna Lika med (=) och Inte lika med (<>) inte ISO-standarden. En SELECT instruktion som använder WHERE column_name = NULL returnerar de rader som har null-värden i column_name. En SELECT instruktion som använder WHERE column_name <> NULL returnerar de rader som har icke-värdenNULL i kolumnen. Dessutom returnerar en SELECT instruktion som använder WHERE column_name <> XYZ_value alla rader som inte är XYZ_value och som inte NULLär .

När ANSI_NULLS är PÅ utvärderas alla jämförelser mot ett nullvärde till UNKNOWN. När SET ANSI_NULLS är AV utvärderas jämförelser av alla data mot ett null-värde till TRUE om datavärdet är NULL. Om SET ANSI_NULLS inte anges gäller inställningen för ANSI_NULLS alternativet för den aktuella databasen. Mer information om databasalternativet finns i ANSI_NULLSALTER DATABASE (Transact-SQL).

I följande tabell visas hur inställningen påverkar ANSI_NULLS resultatet av booleska uttryck med null- och icke-null-värden.

Booleskt uttryck ANGE ANSI_NULLS PÅ STÄLL IN ANSI_NULLS AV
NULL = NULL OKÄND SANN
1 = NULL OKÄND Falskt
NULL <> NULL OKÄND Falskt
1 <> NULL OKÄND SANN
NULL > NULL OKÄND OKÄND
1 > NULL OKÄND OKÄND
NULL IS NULL SANN SANN
1 IS NULL Falskt Falskt
NULL IS NOT NULL Falskt Falskt
1 IS NOT NULL SANN SANN

SET ANSI_NULLS ON påverkar bara en jämförelse om en av jämförelsens operander antingen är en variabel som är NULL eller en literal NULL. Om båda sidor av jämförelsen är kolumner eller sammansatta uttryck påverkar inte inställningen jämförelsen.

För att ett skript ska fungera som avsett, oavsett ANSI_NULLS databasalternativet eller inställningen SET ANSI_NULLSför , använder IS NULL du och IS NOT NULL i jämförelser som kan innehålla null-värden.

ANSI_NULLS ska vara inställt på PÅ för att köra distribuerade frågor.

ANSI_NULLS måste också vara PÅ när du skapar eller ändrar index för beräknade kolumner eller indexerade vyer. Om SET ANSI_NULLS är OFF misslyckas alla CREATE, UPDATE, INSERToch DELETE -instruktioner för tabeller med index på beräknade kolumner eller indexerade vyer. SQL Server returnerar ett fel som visar alla SET-alternativ som strider mot de värden som krävs. När du kör en SELECT instruktion, om SET ANSI_NULLS är AV, ignorerar SQL Server indexvärdena i beräknade kolumner eller vyer och löser select-åtgärden som om det inte fanns några sådana index i tabellerna eller vyerna.

Anmärkning

ANSI_NULLS är ett av sju SET-alternativ som måste anges till nödvändiga värden när du hanterar index för beräknade kolumner eller indexerade vyer. Alternativen ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, QUOTED_IDENTIFIERoch CONCAT_NULL_YIELDS_NULL måste också anges till PÅ och NUMERIC_ROUNDABORT måste anges till OFF.

SQL Server Native Client ODBC-drivrutinen och SQL Server Native Client OLE DB-providern för SQL Server anges ANSI_NULLS automatiskt till PÅ vid anslutning. Den här inställningen kan konfigureras i ODBC-datakällor, i ODBC-anslutningsattribut eller i OLE DB-anslutningsegenskaper som anges i programmet innan du ansluter till en instans av SQL Server. Standardvärdet för SET ANSI_NULLS är AV.

När ANSI_DEFAULTS är PÅ ANSI_NULLS är aktiverat.

Inställningen ANSI_NULLS för definieras vid körning eller körning och inte vid parsningstid.

Om du vill visa den aktuella inställningen för den här inställningen kör du följande fråga:

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

Behörigheter

Kräver medlemskap i offentlig roll.

Exempel

I följande exempel används jämförelseoperatorerna Equals (=) och Not Equal To (<>) för att göra jämförelser med NULL eller 0 och null värdet i en variabel.

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

Resultaten visas i följande tabell.

Lika med Null OlikaNull Lika med noll DifferentZero (på engelska)
Sann Falsk Falsk Sann

Med SET ANSI_NULLS ON alla uttryck skulle utvärderas som "False" eftersom NULL det inte går att jämföra med NULL eller 0 använda dessa operatorer.

I följande exempel används jämförelseoperatorerna Equals (=) och Not Equal To (<>) för att göra jämförelser med NULL och icke-null-värden i en tabell. Exemplet visar också att SET ANSI_NULLS inställningen inte påverkar 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 

Ställ nu in ANSI_NULLS på PÅ och testa.

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  

Ställ nu in ANSI_NULLS på AV och testa.

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;