Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wyjaśnienie ANSI_NULLS programu SQL Server

W SQL Server ANSI_NULLS ustawienie pozwala określić, jak NULL wartości są traktowane w zapytaniach.

Mówiąc dokładniej, pozwala określić zgodne z ISO zachowanie funkcji Equals (= ) i Nie równa się (<> ) operatory porównania, gdy są używane z NULL wartości.

ANSI_NULLS można ustawić na ON lub OFF . NULL test, który zwraca prawdę z ANSI_NULLS OFF może faktycznie zwrócić false z ANSI_NULLS ON .

Może to być źródłem wielu nieporozumień, dlatego warto dokładnie zrozumieć, w jaki sposób ANSI_NULLS Pracuje.

ANSI_NULLS ustawienia można ustawić na poziomie bazy danych i na poziomie sesji. Jeśli ANSI_NULLS ustawienie na poziomie sesji nie jest określone, SQL Server użyje dowolnego ANSI_NULLS ustawienie jest stosowane do bieżącej bazy danych. Dlatego podczas pisania zapytań ad hoc można zastąpić ustawienie bazy danych własnym ustawieniem poziomu sesji.

Należy zauważyć, że sterownik ODBC SQL Server Native Client i dostawca SQL Server Native Client OLE DB dla SQL Server automatycznie ustawiają ANSI_NULLS na ON podczas łączenia. To ustawienie można skonfigurować w źródłach danych ODBC, w atrybutach połączenia ODBC lub we właściwościach połączenia OLE DB, które są ustawione w aplikacji przed nawiązaniem połączenia z wystąpieniem programu SQL Server.

Jak sprawdzić ustawienia ANSI_NULLS sesji

Możesz użyć SESSIONPROPERTY() funkcja sprawdzania ANSI_NULLS ustawienie dla bieżącej sesji.

SELECT SESSIONPROPERTY('ANSI_NULLS');

Wynik:

+--------------------+
| (No column name)   |
|--------------------|
| 1                  |
+--------------------+

W tym przypadku ANSI_NULLS ustawienie dla mojej sesji jest ON .

Zero (0 ) oznaczałoby, że jest wyłączone.

Jak zmienić ustawienia ANSI_NULLS sesji

Możesz ustawić ANSI_NULLS sesji na OFF z następującym kodem:

SET ANSI_NULLS OFF;

Następnie ponowne sprawdzenie go da zero.

SELECT SESSIONPROPERTY('ANSI_NULLS');

Wynik:

+--------------------+
| (No column name)   |
|--------------------|
| 0                  |
+--------------------+

Domyślna wartość dla SET ANSI_NULLS jest OFF . Jednak, jak wspomniano powyżej, sterownik ODBC SQL Server Native Client i dostawca SQL Server Native Client OLE DB dla SQL Server automatycznie ustawiają ANSI_NULLS na ON podczas łączenia.

Przykłady tego, jak ANSI_NULLS Wpływa na zapytania

Oto kilka podstawowych przykładów demonstrujących różne wyniki, które można uzyskać, w zależności od wartości ANSI_NULLS ustawienie.

Używają one SET ANSI_NULLS aby przełączyć ANSI_NULLS ustawienie dla bieżącej sesji.

ANSI_NULLS ON

SET ANSI_NULLS ON;

SELECT NULL
WHERE NULL = NULL;

Wynik:

(0 rows affected)

Kiedy ANSI_NULLS jest ON , wszystkie porównania z NULL wartość oceniana na UNKNOWN .

W tym przypadku nie możemy tak naprawdę powiedzieć, że NULL równa się NULL ponieważ każda wartość jest nieznana.

Dlatego dla powyższego zapytania nie są zwracane żadne wiersze.

ANSI_NULLS OFF

SET ANSI_NULLS OFF;

SELECT NULL
WHERE NULL = NULL;

Wynik:

+--------------------+
| (No column name)   |
|--------------------|
| NULL               |
+--------------------+

Kiedy ANSI_NULLS jest OFF , porównania wszystkich danych z NULL wartość oceniana na TRUE jeśli wartość danych to NULL .

Ta sama logika ma zastosowanie w przypadku korzystania z operatora Nie równa się (<> ).

Rozwińmy przykład tak, aby zawierał operator Nie równe (<> ), a także porównanie NULL i inny niż NULL wartość.

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;

Wynik:

(0 rows affected)
(0 rows affected)
(0 rows affected)
(0 rows affected)

Zgodnie z oczekiwaniami dla żadnego z zapytań nie są zwracane żadne wiersze. Dzieje się tak, ponieważ NULL wartości są traktowane jako UNKNOWN wartość, gdy ANSI_NULLS jest 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;

Wynik:

+--------------------+
| (No column name)   |
|--------------------|
| NULL               |
+--------------------+
(1 row affected)
(0 rows affected)
(0 rows affected)
+--------------------+
| (No column name)   |
|--------------------|
| Not NULL           |
+--------------------+
(1 row affected)

Otrzymamy inny wynik, gdy ANSI_NULLS jest OFF .

W tym przypadku SQL Server nie traktuje NULL jako UNKNOWN . Określa, że ​​NULL jest w rzeczywistości równa NULL .

Nie jest to zgodne ze standardem ANSI.

IS NULL Predykat

Aby skrypt działał zgodnie z przeznaczeniem, niezależnie od ANSI_NULLS opcja bazy danych lub ustawienie SET ANSI_NULLS , użyj IS NULL i IS NOT NULL w porównaniach, które mogą zawierać wartości null

Oto, co się dzieje, gdy przepisujemy poprzedni przykład tak, aby używał IS NULL i 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;

Wynik:

+--------------------+
| (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;

Wynik:

+--------------------+
| (No column name)   |
|--------------------|
| NULL               |
+--------------------+
(1 row affected)
(0 rows affected)
(0 rows affected)
+--------------------+
| (No column name)   |
|--------------------|
| Not NULL           |
+--------------------+
(1 row affected)

Zgodnie z oczekiwaniami otrzymujemy ten sam wynik niezależnie od ANSI_NULLS ustawienie.

Tabela porównawcza

Poniższa tabela przedstawia odmiany, które można uzyskać w zależności od wyrażenia logicznego i ANSI_NULLS ustawienie.

Wyrażenie logiczne WŁĄCZ ANSI_NULLS WYŁĄCZ ANSI_NULLS
NULL =NULL NIEZNANE PRAWDA
1 =NULL NIEZNANE FAŁSZ
NULL <> NULL NIEZNANE FAŁSZ
1 <> NULL NIEZNANE PRAWDA
NULL> NULL NIEZNANE NIEZNANE
1> NULL NIEZNANE NIEZNANE
NULL TO NULL PRAWDA PRAWDA
1 JEST NULL FAŁSZ FAŁSZ
NULL NIE JEST NULL FAŁSZ FAŁSZ
1 NIE JEST NULL PRAWDA PRAWDA

Ustawianie ANSI_NULLS na poziomie bazy danych

Każda baza danych SQL Server ma ANSI_NULLS ustawienie, które określa sposób porównywania z NULL wartości są oceniane.

  • Gdy ustawione na ON , porównania do NULL wartość oceniana na UNKNOWN .
  • Gdy ustawione na OFF , porównania wartości innych niż Unicode z NULL wartość oceniana na TRUE jeśli obie wartości są NULL .

Możesz zmienić to ustawienie w bazie danych za pomocą następującego kodu:

ALTER DATABASE CURRENT
SET ANSI_NULLS ON;

To ustawia ANSI_NULLS na ON dla bieżącej bazy danych. Możesz zamienić CURRENT z nazwą bazy danych, jeśli jest to preferowane.

Możesz sprawdzić bieżące ustawienie za pomocą DATABASEPROPERTYEX() funkcja.

SELECT DATABASEPROPERTYEX('Music','IsAnsiNullsEnabled');

Wynik:

1

Jak wspomniano, możesz zastąpić to ustawienie podczas pisania zapytań ad hoc, ustawiając je na poziomie sesji, tak jak to zrobiliśmy wcześniej.

Skoro jesteśmy przy tym temacie, powinienem wspomnieć, że bazy danych SQL Server mają również ANSI_NULL_DEFAULT ustawienie. To ustawienie określa wartość domyślną NULL lub NOT NULL , kolumny lub typu zdefiniowanego przez użytkownika w środowisku CLR, dla którego dopuszczalność wartości null nie jest jawnie zdefiniowana w CREATE TABLE lub ALTER TABLE sprawozdania.

Tę wartość można ustawić w następujący sposób:

ALTER DATABASE CURRENT
SET ANSI_NULL_DEFAULT ON;

Jego wartość można pobrać w następujący sposób:

SELECT DATABASEPROPERTYEX('Music','IsAnsiNullDefault');

Wynik:

1

Możesz także użyć sys.databases widok katalogu, aby zwrócić te ustawienia dla wszystkich baz danych.

SELECT
    name,
    is_ansi_nulls_on,
    is_ansi_null_default_on
FROM sys.databases
ORDER BY name ASC;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest najlepszy sposób programowego testowania połączenia z programem SQL Server?

  2. Jak korzystać z kreatora importu/eksportu w programie SQL Server — samouczek dotyczący SQL Server/TSQL, część 104

  3. Czy istnieje sposób na pobranie definicji widoku z SQL Server przy użyciu zwykłego ADO?

  4. MySQL - znaczenie PRIMARY KEY, UNIQUE KEY i KEY używane razem podczas tworzenia tabeli

  5. Przepływ warunkowy programu SQL Server