SET ANSI_NULLS (Transact-SQL)

Vonatkozik a következőkre:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitikai Platform System (PDW)SQL adatbázis a Microsoft Fabric-ben

Az Egyenlő () és a Nem egyenlő (=<>) összehasonlító operátor ISO-kompatibilis viselkedését adja meg az SQL Server értékeinek NULL használatakor.

  • SET ANSI_NULLS ON- Kiértékeli mind {expression} = NULL a kettő értékét, mind {expression} <> NULL pedig az értékét False{expression}.NULL Ez a viselkedés ANSI-kompatibilis.
  • SET ANSI_NULLS OFF- Kiértékeli{expression} = NULL, mint True és {expression} <> NULL mintha False az értéke {expression} .NULL Ez a viselkedés nem ajánlott, mert az NULL értékeket nem szabad összehasonlítani a használatával = és <> az operátorokkal.

Megjegyzés:

SET ANSI_NULLS OFF és az ANSI_NULLS OFF adatbázis-beállítás elavult. Az SQL Server 2017-től (14.x) kezdve ANSI_NULLS mindig ON-ra van állítva. Az elavult funkciókat nem szabad használni az új alkalmazásokban. További információ: Elavult adatbázismotor-funkciók az SQL Server 2017-ben.

Transact-SQL szintaxis konvenciók

Szemantika

Szintaxis az SQL Serverhez, kiszolgáló nélküli SQL-készlethez az Azure Synapse Analyticsben, Microsoft Fabric

SET ANSI_NULLS { ON | OFF }

Az Azure Synapse Analytics and Analytics Platform System (PDW) szintaxisa

SET ANSI_NULLS ON

Megjegyzések

Ha ANSI_NULLS be van kapcsolva, a SELECT nulla sorokat használó WHERE column_name = NULL utasítás akkor is nulla sort ad vissza, ha a column_name NULL értékeket tartalmaz. Egy SELECT olyan utasítás, amely nulla sort ad WHERE column_name <> NULL vissza akkor is, ha a column_name nem NULL értékűek.

Ha ANSI_NULLS KIKAPCSOLVA, az Egyenlő (=) és Nem egyenlő (<>) összehasonlító operátorok nem követik az ISO szabványt. Egy SELECT olyan utasítás, amely WHERE column_name = NULL a sorokat adja vissza, amelyek null értékekkel rendelkeznek column_name. Egy SELECT olyan utasítás, amely az oszlopban nemWHERE column_name <> NULL értékeket tartalmazó sorokat ad NULL vissza. Emellett egy SELECT olyan utasítás, amely az WHERE column_name <> XYZ_value összes olyan sort visszaadja, amely nem XYZ_value , és amelyek nem NULL.

Ha ANSI_NULLS be van kapcsolva, a null értékhez viszonyított összes összehasonlítás ISMERETLEN értékre lesz kiértékelve. Ha SET ANSI_NULLS ki van kapcsolva, az összes adat null értékhez viszonyított összehasonlítása IGAZ értéket ad vissza, ha az adatérték .NULL Ha SET ANSI_NULLS nincs megadva, az aktuális adatbázis beállítását ANSI_NULLS kell alkalmazni. További információért az ANSI_NULLS adatbázis opcióról lásd ALTER DATABASE (Transact-SQL).

Az alábbi táblázat bemutatja, hogy a beállítás ANSI_NULLS hogyan befolyásolja a logikai kifejezések eredményeit null és nem null értékekkel.

Logikai kifejezés SET ANSI_NULLS BEKAPCSOLT SET ANSI_NULLS OFF
NULL = NULL ISMERETLEN IGAZ
1 = NULL ISMERETLEN HAMIS
NULL <> NULL ISMERETLEN HAMIS
1 <> NULL ISMERETLEN IGAZ
NULL > NULL ISMERETLEN ISMERETLEN
1 > NULL ISMERETLEN ISMERETLEN
NULL IS NULL IGAZ IGAZ
1 IS NULL HAMIS HAMIS
NULL IS NOT NULL HAMIS HAMIS
1 IS NOT NULL IGAZ IGAZ

SET ANSI_NULLS ON csak akkor befolyásolja az összehasonlítást, ha az összehasonlítás egyik operandusa egy változó, NULL vagy egy literál NULL. Ha az összehasonlítás mindkét oldala oszlop vagy összetett kifejezés, a beállítás nem befolyásolja az összehasonlítást.

Ahhoz, hogy egy szkript a kívánt módon működjön, függetlenül az ANSI_NULLS adatbázis beállításától vagy beállításától SET ANSI_NULLS, használja IS NULL és IS NOT NULL hasonlítsa össze azokat az összehasonlításokat, amelyek null értékeket tartalmazhatnak.

ANSI_NULLS az elosztott lekérdezések végrehajtásához on értékre kell állítani.

ANSI_NULLS akkor is be kell kapcsolnia, ha számított oszlopokon vagy indexelt nézeteken hoz létre vagy módosít indexeket. Ha SET ANSI_NULLS OFF, akkor bármely CREATE, UPDATE, INSERT, és DELETE utasítások olyan táblázatokon vannak, ahol indexek vannak kiszámított oszlopokban vagy indexelt nézetekben, sikertelenül megbukik. Az SQL Server egy hibát ad vissza, amely felsorolja az összes SET olyan opciót, amely megsérti a szükséges értékeket. Ha ki van kapcsolva egy SELECT utasítás SET ANSI_NULLS végrehajtásakor, az SQL Server figyelmen kívül hagyja a számított oszlopok vagy nézetek indexértékeit, és úgy oldja fel a kiválasztási műveletet, mintha nem lennének ilyen indexek a táblákon vagy nézeteken.

Megjegyzés:

ANSI_NULLS a hét SET opció egyike, amelyeket a szükséges értékekre kell állítani, amikor számolt oszlopokon vagy indexelt nézeteken indexeket használunk. A beállításokat ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, QUOTED_IDENTIFIERés CONCAT_NULL_YIELDS_NULL be is kell állítani, és NUMERIC_ROUNDABORT ki kell állítani.

Az SQL Server natív ügyfél ODBC-illesztőprogramja és az SQL Server natív ügyféloldali OLE DB-szolgáltatója az SQL Serverhez csatlakozáskor automatikusan BE értékre van állítva ANSI_NULLS . Ez a beállítás konfigurálható ODBC-adatforrásokban, ODBC-kapcsolatattribútumokban vagy az alkalmazásban beállított OLE DB kapcsolati tulajdonságokban, mielőtt az SQL Server-példányhoz csatlakozna. Az alapértelmezett érték ki SET ANSI_NULLS van kapcsolva.

Ha ANSI_DEFAULTS be van kapcsolva, ANSI_NULLS engedélyezve van.

A beállítás ANSI_NULLS végrehajtáskor vagy futtatáskor van definiálva, és nem elemzési időpontban.

A beállítás aktuális beállításának megtekintéséhez futtassa a következő lekérdezést:

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

Engedélyek

A nyilvános szerepkör tagságát igényli.

Példák

Az alábbi példa az Egyenlőség (=) és a Not Equal To (<>) összehasonlító operátort használja egy változó értékével vagy NULL értékével 0null való összehasonlításhoz.

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

Az eredmények az alábbi táblázatban jelennek meg.

Egyenlő null KülönbözőNull Egyenlő nulla KülönbözőZero
Igaz Téves Téves Igaz

Az SET ANSI_NULLS ON összes kifejezés "Hamis" értékként lesz kiértékelve, mert NULL ezek az NULL operátorok nem hasonlíthatók össze és 0 nem használhatók.

Az alábbi példa az Egyenlőség (=) és a Not Equal To (<>) összehasonlító operátorokat használja a táblákban lévő és nem null értékekkel NULL való összehasonlításhoz. A példa azt is mutatja, hogy a SET ANSI_NULLS beállítás nincs hatással a beállításra 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 

Most állítsd ANSI_NULLS be ON-ra, és teszteld.

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  

Most állítsd ANSI_NULLS KIKAPCSOLÁSRA és teszteld.

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;