В SQL Server, что означает «SET ANSI_NULLS ON»? - PullRequest
72 голосов
/ 19 марта 2012

Определение гласит:

Когда SET ANSI_NULLS включен, оператор SELECT, использующий WHERE column_name = NULL, возвращает ноль строк, даже если в column_name есть нулевые значения. Оператор SELECT, использующий WHERE column_name <> NULL, возвращает ноль строк, даже если в column_name есть ненулевые значения.

Значит ли это, что в этот запрос не будут включены нули?

SELECT Region
FROM employees
WHERE Region = @region

Или ANSI_NULL относится только к таким запросам (где WHERE включает определенное слово NULL)?

SELECT Region
FROM employees
WHERE Region = NULL

Ответы [ 6 ]

57 голосов
/ 19 марта 2012

Это означает, что никакие строки не будут возвращены, если @region равно NULL, при использовании в первом примере, даже если в таблице есть строки, где Region равно NULL.

Когда ANSI_NULLS включен (который вы должны всегда устанавливать в любом случае, так как опция не включать его будет удалена в будущем), любая операция сравнения, в которой (по крайней мере) один из операндов равен NULL, производиттретье логическое значение - UNKNOWN (в отличие от TRUE и FALSE).

UNKNOWN значения распространяются через любые объединяющие логические операторы, если они еще не определены (например, AND соперанд FALSE или OR с операндом TRUE) или отрицания (NOT).

Предложение WHERE используется для фильтрации результирующего набора, созданного предложением FROM,так что общее значение предложения WHERE должно быть TRUE, чтобы строка не была отфильтрована.Таким образом, если при любом сравнении получается UNKNOWN, это приведет к тому, что строка будет отфильтрована.


@ user1227804's answer включает эту цитату:

Если обе стороны сравнения являются столбцами или составными выражениями, настройка не влияет на сравнение.

с SET ANSI_NULLS*

Однако я не уверен, что именно он пытается сделать, поскольку, если сравниваются два столбца NULL (например, в JOIN), сравнение все равно не выполняется:

create table #T1 (
    ID int not null,
    Val1 varchar(10) null
)
insert into #T1(ID,Val1) select 1,null

create table #T2 (
    ID int not null,
    Val1 varchar(10) null
)
insert into #T2(ID,Val1) select 1,null

select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and t1.Val1 = t2.Val1

Приведенный выше запрос возвращает 0 строк, тогда как:

select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and (t1.Val1 = t2.Val1 or t1.Val1 is null and t2.Val1 is null)

Возвращает одну строку.Таким образом, даже если оба операнда являются столбцами, 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 не имел значения.

5 голосов
/ 19 марта 2012

Если @Region не является значением null (скажем, @Region = 'South'), оно не будет возвращать строки, в которых поле Region имеет значение NULL, независимо от значения ANSI_NULLS.

ANSI_NULLS будет толькоразница, когда значение @Region равно null, т. е. когда ваш первый запрос по существу становится вторым.

В этом случае ANSI_NULLS ON не будет возвращать никаких строк (поскольку null = null дастнеизвестное логическое значение (aka null)) и ANSI_NULLS OFF вернут все строки, где поле Region имеет значение null (потому что null = null приведет к true)

2 голосов
/ 02 августа 2017

SET ANSI_NULLS ON

IT Возвращает все значения, включая нулевые значения в таблице

SET ANSI_NULLS off

Заканчивается, когда столбцы содержат нулевые значения

0 голосов
/ 13 декабря 2017

Если для ANSI_NULLS установлено значение «ON» и если мы применяем =, <> к значению столбца NULL при записи оператора select, то он не вернет никакого результата.

Пример

создать таблицу #tempTable (sn int, ename varchar (50))

вставить в # tempTable

выберите 1, 'Manoj'

СОЮЗ ВСЕХ

выберите 2, 'Pankaj'

СОЮЗ ВСЕХ

выберите 3, NULL

UNION ALL

выберите 4, 'Lokesh'

UNION ALL

выберите 5, «Гопал»

SET ANSI_NULLS ON

select * from #tempTable, где ename равно NULL - (затронуто 1 строк)

select * from #tempTable, где ename = NULL - (затронуто 0 строк)

select * from #tempTable, где ename <> NULL - (затронуто 0 строк)

SET ANSI_NULLS OFF

select * from #tempTable, где ename равно NULL - (затронуто 1 строк)

select * from #tempTable, где ename = NULL - (затронуто 1 строк)

select * from #tempTable, где ename не равно NULL - (затронуто 4 строк)

select * from #tempTable, где ename <> NULL - (затронуто 4 строк)

0 голосов
/ 06 апреля 2017

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql

Когда SET ANSI_NULLS включен, оператор SELECT, использующий WHERE column_name = NULL, возвращает ноль строк, даже если в column_name есть нулевые значения.Оператор SELECT, использующий WHERE column_name <> NULL, возвращает ноль строк, даже если в column_name есть ненулевые значения.

Например,

DECLARE @TempVariable VARCHAR(10)
SET @TempVariable = NULL

SET ANSI_NULLS ON
SELECT 'NO ROWS IF SET ANSI_NULLS ON' where    @TempVariable = NULL
-- IF ANSI_NULLS ON , RETURNS ZERO ROWS


SET ANSI_NULLS OFF
SELECT 'THERE WILL BE A ROW IF ANSI_NULLS OFF' where    @TempVariable =NULL
-- IF ANSI_NULLS OFF , THERE WILL BE ROW !
0 голосов
/ 23 июня 2015

При установке значения ANSI NULLS значение NULL = NULL будет равно true.EG:

        SET ANSI_NULLS OFF
        select * from sys.tables
        where principal_id = Null

вернет некоторый результат, как показано ниже: zcwInvoiceDeliveryType 744547 NULL zcExpenseRptStatusTrack 2099048 NULL ZCVendorPermissions 2840564 NULL ZCWOrgLevelClientFee 4 1004 * * * 5 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 * * * * * * * * * * * * * * * * 100 * * * * * * * * * * * * * * * 0 * * * * * * * * * * * 0 * * * * 0 * * * * * * * * * * * 0 * * * * * * * * * 0 * * * * * * * * * * * 0 * 0 * 0 * * * * * * * * * * * * * * * * * 0 * 0 * 100 *.1007 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...