sql >> Databáze >  >> RDS >> Sqlserver

SQL Server ANSI_NULLS Vysvětleno

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í s NULL hodnota se vyhodnotí na UNKNOWN .
  • Při nastavení na OFF , porovnání hodnot, které nejsou Unicode, s NULL hodnota se vyhodnotí na TRUE pokud jsou obě hodnoty NULL .

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;


  1. Zabezpečení databáze – šifrování záloh během přepravy a v klidu

  2. Počet SQL

  3. Konfigurace ověřování LDAP a mapování skupin pomocí MariaDB

  4. Pomocí setDate v PreparedStatement