Це означає, що при використанні у вашому першому прикладі не буде повернено рядків, якщо @region
є NULL
, навіть якщо в таблиці є рядки, де Region
є NULL
.
Коли ANSI_NULLS
ввімкнено (що ви повинні завжди встановлювати в будь-якому випадку, оскільки опція не мати його буде видалена в майбутньому), будь-яка операція порівняння, де (принаймні) один з операндів NULL
виробляє третє логічне значення - UNKNOWN
( на відміну від TRUE
і FALSE
).
UNKNOWN
значення поширюються через будь-які комбінуючі логічні оператори, якщо вони ще не визначені (наприклад, AND
з FALSE
операндом або OR
з TRUE
операндом) або запереченнями ( NOT
).
WHERE
Пропозиція використовується для фільтрації результуючого набору , отриманого з допомогою FROM
пункту, таким чином, щоб загальна величина WHERE
п повинна бути TRUE
для рядка , щоб не бути відфільтровані. Отже, якщо за UNKNOWN
результатами будь-якого порівняння отримано значення an , це призведе до фільтрування рядка.
@ User1227804 в відповідь включає цю цитату:
Якщо обидві сторони порівняння - це стовпці або складені вирази, параметр не впливає на порівняння.
від *SET ANSI_NULLS
Однак я не впевнений, який момент він намагається зробити, оскільки якщо NULL
порівнювати два стовпці (наприклад, в a JOIN
), порівняння все одно не вдається:
create table
ID int not null,
Val1 varchar(10) null
)
insert into
create table
ID int not null,
Val1 varchar(10) null
)
insert into
select * from
Наведений вище запит повертає 0 рядків, тоді як:
select * from
Повертає один рядок. Отже, навіть коли обидва операнди є стовпцями, NULL
не дорівнює NULL
. І документація для=
не має нічого сказати про операнди:
Коли ви порівнюєте два NULL
вирази, результат залежить від ANSI_NULLS
налаштування:
Якщо ANSI_NULLS
встановлено значення ON
, результат дорівнює NULL
1 , дотримуючись положення ANSI, що NULL
(або невідоме) значення не дорівнює іншому NULL
або невідомому значенню.
Якщо ANSI_NULLS
встановлено значення OFF
, результат NULL
порівняння з NULL
є TRUE
.
Порівняння NULL
з нецінністю NULL
завжди призводить до FALSE
2 .
Однак і 1, і 2 є неправильними - результат обох порівнянь є UNKNOWN
.
* Таємниче значення цього тексту було остаточно виявлено роками пізніше. Це насправді означає, що для цих порівнянь параметр не має ефекту, і він завжди діє так, ніби параметр увімкнений . Було б зрозуміліше, якби там було зазначено, що SET ANSI_NULLS OFF
це обстановка не мала ніякого впливу.