Це означає, що при використанні у вашому першому прикладі не буде повернено рядків, якщо @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, результат дорівнює NULL1 , дотримуючись положення ANSI, що NULL(або невідоме) значення не дорівнює іншому NULLабо невідомому значенню.
Якщо ANSI_NULLSвстановлено значення OFF, результат NULLпорівняння з NULLє TRUE.
Порівняння NULLз нецінністю NULLзавжди призводить до FALSE2 .
Однак і 1, і 2 є неправильними - результат обох порівнянь є UNKNOWN.
* Таємниче значення цього тексту було остаточно виявлено роками пізніше. Це насправді означає, що для цих порівнянь параметр не має ефекту, і він завжди діє так, ніби параметр увімкнений . Було б зрозуміліше, якби там було зазначено, що SET ANSI_NULLS OFFце обстановка не мала ніякого впливу.