V SQL Server, ANSI_NULLS
nastavení umožňuje určit, jak NULL
hodnoty jsou zpracovávány v dotazech.
Konkrétněji vám umožňuje specifikovat chování Equals v souladu s ISO (=
) a Nerovná se (<>
) porovnávací operátory, když jsou použity s NULL
hodnoty.
ANSI_NULLS
lze nastavit na ON
nebo OFF
. A NULL
test, který vrátí hodnotu true s ANSI_NULLS OFF
může ve skutečnosti vrátit hodnotu false s ANSI_NULLS ON
.
To může být zdrojem mnoha zmatků, a proto se vyplatí přesně pochopit, jak ANSI_NULLS
funguje.
ANSI_NULLS
nastavení lze nastavit na úrovni databáze a na úrovni relace. Pokud je ANSI_NULLS
není zadáno nastavení na úrovni relace, SQL Server použije kteroukoli možnost ANSI_NULLS
nastavení se použije na aktuální databázi. Proto můžete při psaní ad hoc dotazů přepsat nastavení databáze vlastním nastavením úrovně relace.
Důležité je poznamenat, že ovladač SQL Server Native Client ODBC a SQL Server Native Client OLE DB Provider pro SQL Server automaticky nastaví ANSI_NULLS
na ON
při připojení. Toto nastavení lze nakonfigurovat ve zdrojích dat ODBC, v atributech připojení ODBC nebo ve vlastnostech připojení OLE DB, které se nastavují v aplikaci před připojením k instanci serveru SQL Server.
Jak zkontrolovat nastavení ANSI_NULLS relace
Můžete použít SESSIONPROPERTY()
funkci pro kontrolu ANSI_NULLS
nastavení pro aktuální relaci.
SELECT SESSIONPROPERTY('ANSI_NULLS');
Výsledek:
+--------------------+ | (No column name) | |--------------------| | 1 | +--------------------+
V tomto případě ANSI_NULLS
nastavení pro mou relaci je ON
.
Nula (0
) by znamenalo, že je vypnutý.
Jak změnit nastavení ANSI_NULLS relace
Nastavení ANSI_NULLS relace můžete nastavit na OFF
s následujícím kódem:
SET ANSI_NULLS OFF;
Pak znovu zaškrtnete nulu.
SELECT SESSIONPROPERTY('ANSI_NULLS');
Výsledek:
+--------------------+ | (No column name) | |--------------------| | 0 | +--------------------+
Výchozí hodnota pro SET ANSI_NULLS
je OFF
. Jak je však uvedeno výše, ovladač SQL Server Native Client ODBC a SQL Server Native Client OLE DB Provider pro SQL Server automaticky nastaví ANSI_NULLS
na ON
při připojování.
Příklady postupu ANSI_NULLS
Ovlivňuje dotazy
Zde je několik základních příkladů, které demonstrují různé výsledky, které můžete získat v závislosti na hodnotě ANSI_NULLS
nastavení.
Tyto používají SET ANSI_NULLS
pro přepnutí ANSI_NULLS
nastavení pro aktuální relaci.
ANSI_NULLS ON
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
Výsledek:
(0 rows affected)
Když ANSI_NULLS
je ON
, všechna srovnání s NULL
hodnota se vyhodnotí na UNKNOWN
.
V tomto případě nemůžeme pravdivě říci, že NULL
rovná se NULL
protože každá hodnota je neznámá.
Proto nejsou pro výše uvedený dotaz vráceny žádné řádky.
ANSI_NULLS OFF
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
Výsledek:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+
Když ANSI_NULLS
je OFF
, porovnání všech dat s NULL
hodnota se vyhodnotí na TRUE
pokud je hodnota dat NULL
.
Stejná logika platí při použití operátoru Nerovná se (<>
).
Rozšiřme příklad tak, aby zahrnoval operátor Nerovná se (<>
), stejně jako srovnání mezi NULL
a neNULL
hodnotu.
ANSI_NULLS ON
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;
Výsledek:
(0 rows affected) (0 rows affected) (0 rows affected) (0 rows affected)
Podle očekávání nejsou vráceny žádné řádky pro žádný z dotazů. Důvodem je NULL
hodnoty jsou považovány za UNKNOWN
hodnotu při ANSI_NULLS
je ON
.
ANSI_NULLS OFF
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;
Výsledek:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
Když ANSI_NULLS
, dostaneme jiný výsledek je OFF
.
V tomto případě SQL Server nezachází s NULL
jako UNKNOWN
. Určuje, že NULL
je ve skutečnosti rovno NULL
.
To není v souladu se standardem ANSI.
Položka IS NULL
Predikát
Aby skript fungoval tak, jak má, bez ohledu na ANSI_NULLS
možnost databáze nebo nastavení SET ANSI_NULLS
, použijte IS NULL
a IS NOT NULL
v porovnáních, která mohou obsahovat hodnoty null
Zde je to, co se stane, když přepíšeme předchozí příklad tak, aby používal IS NULL
a IS NOT NULL
.
ANSI_NULLS ON
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;
Výsledek:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
ANSI_NULLS OFF
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;
Výsledek:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)
Podle očekávání získáme stejný výsledek bez ohledu na ANSI_NULLS
nastavení.
Srovnávací tabulka
Následující tabulka uvádí varianty, které můžete získat v závislosti na booleovském výrazu a ANSI_NULLS
nastavení.
Booleovský výraz | NASTAVIT ANSI_NULLS ZAPNUTO | VYPNĚTE ANSI_NULLS |
---|---|---|
NULL =NULL | NEZNÁMÝ | PRAVDA |
1 =NULL | NEZNÁMÝ | NEPRAVDA |
NULL <> NULL | NEZNÁMÝ | NEPRAVDA |
1 <> NULL | NEZNÁMÝ | PRAVDA |
NULL> NULL | NEZNÁMÝ | NEZNÁMÝ |
1> NULL | NEZNÁMÝ | NEZNÁMÝ |
NULL JE NULL | PRAVDA | PRAVDA |
1 JE NULL | NEPRAVDA | NEPRAVDA |
NULL NENÍ NULL | NEPRAVDA | NEPRAVDA |
1 NENÍ NULL | PRAVDA | PRAVDA |
Nastavení ANSI_NULLS na úrovni databáze
Každá databáze SQL Server má ANSI_NULLS
nastavení, které určuje, jak se porovnává s NULL
hodnoty jsou vyhodnoceny.
- Při nastavení na
ON
, srovnání sNULL
hodnota se vyhodnotí naUNKNOWN
. - Při nastavení na
OFF
, porovnání hodnot, které nejsou Unicode, sNULL
hodnota se vyhodnotí naTRUE
pokud jsou obě hodnotyNULL
.
Toto nastavení v databázi můžete změnit pomocí následujícího kódu:
ALTER DATABASE CURRENT
SET ANSI_NULLS ON;
Tím se nastaví ANSI_NULLS
na ON
pro aktuální databázi. Můžete vyměnit CURRENT
případně s názvem databáze.
Aktuální nastavení můžete zkontrolovat pomocí DATABASEPROPERTYEX()
funkce.
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullsEnabled');
Výsledek:
1
Jak již bylo zmíněno, toto nastavení můžete přepsat při psaní ad hoc dotazů nastavením na úrovni relace, jako jsme to udělali dříve.
Když už jsme u tohoto tématu, měl bych zmínit, že databáze SQL Server mají také ANSI_NULL_DEFAULT
nastavení. Toto nastavení určuje výchozí hodnotu NULL
nebo NOT NULL
, sloupec nebo uživatelsky definovaný typ CLR, pro který není možnost null explicitně definována v CREATE TABLE
nebo ALTER TABLE
prohlášení.
Tuto hodnotu lze nastavit takto:
ALTER DATABASE CURRENT
SET ANSI_NULL_DEFAULT ON;
Jeho hodnotu lze získat takto:
SELECT DATABASEPROPERTYEX('Music','IsAnsiNullDefault');
Výsledek:
1
Můžete také použít sys.databases
zobrazení katalogu pro vrácení těchto nastavení pro všechny databáze.
SELECT
name,
is_ansi_nulls_on,
is_ansi_null_default_on
FROM sys.databases
ORDER BY name ASC;