Sdílet prostřednictvím


NASTAVIT ANSI_NULLS (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)databáze SQL v Microsoft Fabric

Určuje chování kompatibilní se standardem ISO relačních operátorů Equals (=) a Not Equal To (<>) při jejich použití s NULL hodnotami v SQL Serveru.

  • SET ANSI_NULLS ON - Vyhodnocuje obojí {expression} = NULL a {expression} <> NULL jako False by hodnota {expression} je NULL. Toto chování je kompatibilní se standardem ANSI.
  • SET ANSI_NULLS OFF - Vyhodnotí {expression} = NULL jako True a {expression} <> NULL jako False by hodnota {expression} je NULL. Toto chování se nedoporučuje, protože NULL hodnoty by neměly být porovnány pomocí = a <> operátory.

Poznámka:

SET ANSI_NULLS OFF ANSI_NULLS OFF a možnost databáze je zastaralá. Počínaje SQL Serverem 2017 (14.x) je ANSI_NULLS vždy nastaveno na ZAPNUTO. Zastaralé funkce by se neměly používat v nových aplikacích. Další informace najdete v tématu Zastaralé funkce databázového stroje v SQL Serveru 2017.

Transact-SQL konvence syntaxe

Syntaxe

Syntaxe pro SQL Server, bezserverový fond SQL ve službě Azure Synapse Analytics, Microsoft Fabric

SET ANSI_NULLS { ON | OFF }

Syntaxe pro Azure Synapse Analytics a systém analytických platforem (PDW)

SET ANSI_NULLS ON

Poznámky

Pokud ANSI_NULLS je zapnuto SELECT , příkaz, který používá WHERE column_name = NULL nulové řádky, i když jsou hodnoty NULL v column_name. Příkaz SELECT , který používá WHERE column_name <> NULL nulové řádky, i když v column_name existují hodnoty, které nemají hodnotu NULL.

Pokud je ANSI_NULLS VYPNUTO, operátory porovnání Rovná se (=) a Nerovnají se (<>) se neshodují se standardem ISO. Příkaz SELECT , který používá WHERE column_name = NULL , vrátí řádky, které mají v column_name hodnoty null. Příkaz SELECT , který používá WHERE column_name <> NULL , vrátí řádky, které ve sloupci nemají hodnotyNULL . Také příkaz, SELECT který používá WHERE column_name <> XYZ_value vrátí všechny řádky, které nejsou XYZ_value a které nejsou NULL.

Pokud ANSI_NULLS je zapnuto, jsou všechna porovnání s hodnotou null vyhodnocena jako UNKNOWN. Pokud SET ANSI_NULLS je vypnuto, porovnání všech dat s hodnotou null se vyhodnotí jako PRAVDA, pokud je NULLhodnota dat . Pokud SET ANSI_NULLS není zadáno, použije se nastavení ANSI_NULLS možnosti aktuální databáze. Další informace o ANSI_NULLS možnosti databáze naleznete v tématu ALTER DATABASE (Transact-SQL).

Následující tabulka ukazuje, jak nastavení ANSI_NULLS ovlivňuje výsledky logických výrazů používajících hodnoty null a nenulové hodnoty.

Logický výraz NASTAVIT ANSI_NULLS ZAPNUTO NASTAVENÍ ANSI_NULLS VYPNUTO
NULL = NULL NEZNÁMÝ PRAVDIVÝ
1 = NULL NEZNÁMÝ NEPRAVDA
NULL <> NULL NEZNÁMÝ NEPRAVDA
1 <> NULL NEZNÁMÝ PRAVDIVÝ
NULL > NULL NEZNÁMÝ NEZNÁMÝ
1 > NULL NEZNÁMÝ NEZNÁMÝ
NULL IS NULL PRAVDIVÝ PRAVDIVÝ
1 IS NULL NEPRAVDA NEPRAVDA
NULL IS NOT NULL NEPRAVDA NEPRAVDA
1 IS NOT NULL PRAVDIVÝ PRAVDIVÝ

SET ANSI_NULLS ON ovlivňuje porovnání pouze v případě, že jeden z operandů porovnání je proměnná, která je NULL nebo literál NULL. Pokud jsou obě strany porovnání sloupce nebo složené výrazy, nastavení nemá vliv na porovnání.

Aby skript fungoval tak, jak má, bez ANSI_NULLS ohledu na možnost databáze nebo nastavení SET ANSI_NULLS, použití IS NULL a IS NOT NULL v porovnání, které mohou obsahovat hodnoty null.

ANSI_NULLS pro spouštění distribuovaných dotazů by měla být nastavená na HODNOTU ON.

ANSI_NULLS při vytváření nebo změně indexů ve vypočítaných sloupcích nebo indexovaných zobrazeních musí být zapnuté. Pokud je ANSI_NULLS SET vypnuto, všechny CREATEUPDATEINSERTpříkazy , , a DELETE příkazy v tabulkách s indexy ve vypočítaných sloupcích nebo indexovaných zobrazeních selžou. SQL Server vrátí chybu se seznamem všech možností SET, které porušují požadované hodnoty. Pokud je příkaz SELECT vypnutý, SET ANSI_NULLS SQL Server také ignoruje hodnoty indexu ve vypočítaných sloupcích nebo zobrazeních a přeloží operaci výběru, jako kdyby v tabulkách nebo zobrazeních nebyly žádné takové indexy.

Poznámka:

ANSI_NULLS je jednou ze sedmi možností SET, které musí být nastaveny na požadované hodnoty při práci s indexy ve vypočítaných sloupcích nebo indexovaných zobrazeních. Možnosti ANSI_PADDING, , ANSI_WARNINGSARITHABORT, QUOTED_IDENTIFIERa CONCAT_NULL_YIELDS_NULL musí být také nastaveny na ZAPNUTO a NUMERIC_ROUNDABORT musí být nastaveny na VYPNUTO.

Ovladač ODBC nativního klienta SQL Serveru a zprostředkovatel OLE DB nativního klienta SYSTÉMU SQL Server pro SQL Server automaticky nastaven na ANSI_NULLS ZAPNUTO při připojování. Toto nastavení lze nakonfigurovat ve zdrojích dat ODBC, v atributech připojení ODBC nebo ve vlastnostech připojení OLE DB, které jsou nastaveny v aplikaci před připojením k instanci SQL Serveru. Výchozí hodnota je SET ANSI_NULLS VYPNUTÁ.

Je-li ANSI_DEFAULTS zapnuto, ANSI_NULLS je povoleno.

Nastavení ANSI_NULLS je definováno při spuštění nebo spuštění, a ne v době analýzy.

Pokud chcete zobrazit aktuální nastavení tohoto nastavení, spusťte následující dotaz:

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

Povolení

Vyžaduje členství ve veřejné roli .

Příklady

Následující příklad používá operátory porovnání Equals (=) a Not Equal To (<>) k porovnání s NULL nebo 0 a null hodnotu v proměnné.

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

Výsledky se zobrazují v následující tabulce.

Rovná se hodnota null DifferentNull Rovná se nule DifferentZero
Pravdivé Nepravda Nepravda Pravdivé

U SET ANSI_NULLS ON všech výrazů by se vyhodnotil jako Nepravda, protože NULL je nelze porovnat s NULL těmito operátory ani 0 je použít.

Následující příklad používá relační operátory Equals (=) a Not Equal To (<>) k porovnání s hodnotami, které NULL nejsou null v tabulce. Příklad také ukazuje, že SET ANSI_NULLS nastavení nemá vliv 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 

Teď nastavte ANSI_NULLS na zapnuto a otestujte.

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  

Teď nastavte ANSI_NULLS na VYPNUTO a otestujte.

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;