Megosztás a következőn keresztül:


SETT 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 kezdve (14.x) a ANSI_NULLS mindig BE értékre 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 ki van kapcsolva, az Egyenlő (=) és a 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. Az adatbázis beállításával kapcsolatos további információkért lásd: ANSI_NULLSALTER 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 BE ANSI_NULLS BEÁLLÍTÁSA ANSI_NULLS KIKAPCSOLÁSA
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 a SET ANSI_NULLS ki van kapcsolva, a számított oszlopokon vagy CREATE indexelt nézeteken lévő indexekkel rendelkező táblák bármelyikeUPDATEINSERTDELETE, illetve utasítása meghiúsul. Az SQL Server hibát ad vissza, amely felsorolja az összes olyan SET-beállítást, 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 egyike annak a hét SET beállításnak, amelyet kötelező értékekre kell állítani a számított oszlopok vagy indexelt nézetek indexeinek kezelésekor. 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ítsa be a ANSI_NULLS ON értékre, és tesztelje.

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ítsa a ANSI_NULLS KI értékre, és tesztelje.

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;