sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server ANSI_NULLS förklaras

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

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 en NULL värde utvärdera till OKNÄNT .
  • När inställd på AV , jämförelser av icke-Unicode-värden med en NULL värde utvärderas till TRUE om båda värdena är NULL .

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;


  1. inaktivera NOTICES i psql-utgång

  2. Hur man får det aktuella datumet i MySQL

  3. Hur hoppar man över kolumner i CSV-fil när man importerar till MySQL-tabell med LOAD DATA INFILE?

  4. Installera Oracle 11g Release 2 Enterprise Edition på Windows 7 32-bitars