Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics 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
somFalse
om värdet{expression}
för ärNULL
. Det här beteendet är ANSI-kompatibelt. -
SET ANSI_NULLS OFF
– Utvärderar{expression} = NULL
somTrue
och{expression} <> NULL
somFalse
om värdet{expression}
för ärNULL
. Det här beteendet rekommenderas inte eftersomNULL
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_NULLS
ALTER 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_NULLS
fö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
, INSERT
och 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_IDENTIFIER
och 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;