I SQL Server, ANSI_NULLS
inställningen låter dig specificera hur NULL
värden behandlas i frågor.
Mer specifikt låter det dig specificera ISO-kompatibelt beteende för Equals (=
) och Inte lika med (<> ) jämförelseoperatorer när de används med
NULL
värden.
ANSI_NULLS
kan ställas in på ON
eller AV
. En NULL
test som returnerar sant med ANSI_NULLS AV
kan faktiskt returnera false med ANSI_NULLS PÅ
.
Detta kan vara källan till mycket förvirring, och därför lönar det sig att förstå exakt hur ANSI_NULLS
Arbetar.
ANSI_NULLS
inställningar kan ställas in på databasnivå och på sessionsnivå. Om en ANSI_NULLS
inställningen på sessionsnivån inte anges, SQL Server kommer att använda vilken ANSI_NULLS
som helst inställningen tillämpas på den aktuella databasen. Därför kan du åsidosätta databasinställningen med din egen sessionsnivåinställning när du skriver ad hoc-frågor.
En viktig sak att notera är att SQL Server Native Client ODBC-drivrutinen och SQL Server Native Client OLE DB Provider för SQL Server automatiskt ställer in ANSI_NULLS
till ON
vid anslutning. Den här inställningen kan konfigureras i ODBC-datakällor, i ODBC-anslutningsattribut eller i OLE DB-anslutningsegenskaper som ställs in i programmet innan du ansluter till en instans av SQL Server.
Hur du kontrollerar din sessions ANSI_NULLS-inställning
Du kan använda SESSIONPROPERTY()
funktion för att kontrollera ANSI_NULLS
inställning för den aktuella sessionen.
SELECT SESSIONPROPERTY('ANSI_NULLS');
Resultat:
+--------------------+ | (No column name) | |--------------------| | 1 | +--------------------+
I det här fallet, ANSI_NULLS
inställningen för min session är ON
.
En nolla (0
) skulle betyda att den är avstängd.
Hur du ändrar din sessions ANSI_NULLS-inställning
Du kan ställa in sessionens ANSI_NULLS-inställning till OFF
med följande kod:
SET ANSI_NULLS OFF;
Om du sedan markerar det igen kommer det att ge en nolla.
SELECT SESSIONPROPERTY('ANSI_NULLS');
Resultat:
+--------------------+ | (No column name) | |--------------------| | 0 | +--------------------+
Standardvärdet för SET ANSI_NULLS
är AV
. Men som nämnts ovan ställer SQL Server Native Client ODBC-drivrutinen och SQL Server Native Client OLE DB Provider för SQL Server automatiskt in ANSI_NULLS
till ON
vid anslutning.
Exempel på hur ANSI_NULLS
Påverkar frågor
Här är några grundläggande exempel för att visa de olika resultat du kan få, beroende på värdet på ANSI_NULLS
inställning.
Dessa använder SET ANSI_NULLS
för att växla ANSI_NULLS
inställning för den aktuella sessionen.
ANSI_NULLS PÅ
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
Resultat:
(0 rows affected)
När ANSI_NULLS
är PÅ
, alla jämförelser mot en NULL
värde utvärdera till OKNÄNT
.
I det här fallet kan vi inte riktigt säga att NULL
är lika med NULL
eftersom varje värde är okänt.
Därför returneras inga rader för ovanstående fråga.
ANSI_NULLS AV
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
Resultat:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+
När ANSI_NULLS
är AV
, jämförelser av all data mot en NULL
värde utvärderas till TRUE
om datavärdet är NULL
.
Samma logik gäller när du använder operatorn Inte lika med (<> ).
Låt oss utöka exemplet så att det inkluderar operatorn Not Equal To (<>
), samt en jämförelse mellan NULL
och en icke-NULL
värde.
ANSI_NULLS PÅ
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL;
Resultat:
(0 rows affected) (0 rows affected) (0 rows affected) (0 rows affected)
Som förväntat returneras inga rader för någon av frågorna. Detta beror på att NULL
värden behandlas som en OKKEN
värde när ANSI_NULLS
är PÅ
.
ANSI_NULLS AV
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
SELECT 'Not NULL'
WHERE NULL <> NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL;
Resultat:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
Vi får ett annat resultat när ANSI_NULLS
är AV
.
I det här fallet behandlar SQL Server inte NULL
som OKÄNDA
. Det bestämmer att NULL
är faktiskt lika med NULL
.
Detta är inte kompatibelt med ANSI-standarden.
ÄR NULL Predikat
För att ett skript ska fungera som avsett, oavsett ANSI_NULLS
databasalternativ eller inställningen för SET ANSI_NULLS
, använd IS NULL
och ÄR INTE NULL
i jämförelser som kan innehålla nullvärden
Här är vad som händer när vi skriver om det föregående exemplet för att använda IS NULL
och ÄR INTE NULL
.
ANSI_NULLS PÅ
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL;
Resultat:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
ANSI_NULLS AV
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL IS NULL;
SELECT NULL
WHERE NULL IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL;
Resultat:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
Som förväntat får vi samma resultat oavsett ANSI_NULLS
inställning.
Jämförelsetabell
Följande tabell beskriver de varianter du kan få beroende på det booleska uttrycket och ANSI_NULLS
inställning.
Booleskt uttryck | STÄLL PÅ ANSI_NULLS | STÄLL AV ANSI_NULLS |
---|---|---|
NULL =NULL | OKÄNT | SANT |
1 =NULL | OKÄNT | FALSKT |
NULL <> NULL | OKÄNT | FALSKT |
1 <> NULL | OKÄNT | SANT |
NULL> NULL | OKÄNT | OKÄNT |
1> NULL | OKÄNT | OKÄNT |
NULL ÄR NULL | SANT | SANT |
1 ÄR NULL | FALSKT | FALSKT |
NULL ÄR INTE NULL | FALSKT | FALSKT |
1 ÄR INTE NULL | SANT | SANT |
Ställa in ANSI_NULLS på databasnivå
Varje SQL Server-databas har en ANSI_NULLS
inställning, som bestämmer hur jämförelser med NULL
värden utvärderas.
- När inställd på
ON
, jämförelser med enNULL
värde utvärdera tillOKNÄNT
. - När inställd på
AV
, jämförelser av icke-Unicode-värden med enNULL
värde utvärderas tillTRUE
om båda värdena ärNULL
.
Du kan ändra denna inställning på en databas med följande kod:
ALTER DATABASE CURRENT
SET ANSI_NULLS ON;
Det ställer in ANSI_NULLS
till ON
för den aktuella databasen. Du kan byta ut CURRENT
med namnet på en databas om så önskas.
Du kan kontrollera den aktuella inställningen med DATABASEPROPERTYEX()
funktion.
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullsEnabled');
Resultat:
1
Som nämnts kan du åsidosätta den här inställningen när du skriver ad hoc-frågor genom att ställa in den på sessionsnivå som vi gjorde tidigare.
Medan vi är inne på ämnet bör jag nämna att SQL Server-databaser också har en ANSI_NULL_DEFAULT
miljö. Den här inställningen bestämmer standardvärdet, NULL
eller NOT NULL
, av en kolumn eller CLR användardefinierad typ för vilken nollbarheten inte är uttryckligen definierad i SKAPA TABELL
eller ÄNDRA TABELL
uttalanden.
Detta värde kan ställas in så här:
ALTER DATABASE CURRENT
SET ANSI_NULL_DEFAULT ON;
Dess värde kan hämtas så här:
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullDefault');
Resultat:
1
Du kan också använda sys.databases
katalogvy för att returnera dessa inställningar för alla databaser.
SELECT
name,
is_ansi_nulls_on,
is_ansi_null_default_on
FROM sys.databases
ORDER BY name ASC;