Это означает , что ни одна строка не будет возвращена , если @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это настройка, которая не имеет никакого влияния.