Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics 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} = NULLa{expression} <> NULLjakoFalseby hodnota{expression}jeNULL. Toto chování je kompatibilní se standardem ANSI. -
SET ANSI_NULLS OFF- Vyhodnotí{expression} = NULLjakoTruea{expression} <> NULLjakoFalseby hodnota{expression}jeNULL. Toto chování se nedoporučuje, protožeNULLhodnoty 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.
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;