В SQL Server, что означает" установить ANSI NULLS ON"?
определение говорит:
когда 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_NULLs касается только таких запросов, как этот (где же WHERE включает в себя специфические слова NULL)?
SELECT Region
FROM employees
WHERE Region = NULL
7 ответов:
это означает, что строки будут возвращены, если
@regionиNULL, при использовании в вашем первом примере, даже если есть строки в таблице, гдеRegionиNULL., когда
ANSI_NULLSвключен (который вы всегда должны устанавливать в любом случае, так как опция не включать его будет удалена в будущем), любая операция сравнения, где (по крайней мере) один из операндовNULLвыдает третье логическое значение -UNKNOWN(вместоTRUEиFALSE).
UNKNOWNзначения распространяются через любые комбинирующие булевы операторы, если они еще не определены (например,ANDСFALSEоперанд илиORСTRUEоперанд) или отрицания (NOT).The
WHEREпредложение используется для фильтрации результирующего набора, созданногоFROMпредложение, такое, что общее значениеWHEREстатья должна бытьTRUEдля строки, которая не будет отфильтрована. Так что, еслиUNKNOWNпроизведено любым сравнением, им приведет к тому, что строка будет отфильтрована.
@user1227804 это ответ включает в себя эта цитата:
если обе стороны сравнения являются столбцами или составными выражениями, параметр не влияет на сравнение.
однако я не уверен, какой смысл он пытается сделать, так как если два
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. А то документация=не имеет ничего сказать об операндах:, и 1 и 2 неправильно - результат из обоих сравнений естькогда вы сравниваете два
NULLвыражения, результат зависит отANSI_NULLSустановка:если
ANSI_NULLSустановлено значениеON, результатNULL1, следуя конвенции ANSI, что aNULL(или неизвестно) значение не равно другомуNULLили неизвестное значение.если
ANSI_NULLSустановлено значениеOFF, результатNULLпо сравнению сNULL- этоTRUE.сравнение
NULLдоNULLзначение всегда приводит кFALSE2.UNKNOWN.
*загадочный смысл этого текста был, наконец, обнаружен много лет спустя. На самом деле это означает, что для этих сравнений настройка не имеет никакого эффекта и он всегда действует так, как если бы параметр был включен. Было бы яснее, если бы он заявил, что
SET ANSI_NULLS OFFбыла установка, которая не имела никакого влияния.
УСТАНОВИТЬ QUOTED_IDENTIFIER ВКЛ / ВЫКЛ
он указывает, как SQL Server обрабатывает данные, определенные в одинарных и двойных кавычках.
когда он установлен в ON любой набор символов, определенный в двойные кавычки ""составляет обрабатывается как идентификатор T-SQL (Имя Таблицы, Имя Процесса, Имя Столбца....и т. д.)
когда любой набор символов, определенный в одинарные кавычки ‘ is рассматривается как литерал.
SET QUOTED_IDENTIFIER ON CREATE TABLE "SELECT" ("TABLE" int) -- SUCCESS GO SET QUOTED_IDENTIFIER ON SELECT "sometext" AS Value -- FAIL because “sometext” is not a literalкогда он установлен в выкл любой набор символов, который определен либо в Single кавычки или в двойные кавычки трактуется как литерал.
SET QUOTED_IDENTIFIER OFF CREATE TABLE "SELECT"(“TABLE” int) -- FAIL GO SET QUOTED_IDENTIFIER OFF SELECT "sometext" AS Value -- SUCCESS as “sometext” is treated litral --The default behavior is ON in any database.УСТАНОВИТЬ ANSI_NULLS ВКЛ / ВЫКЛ:
параметр ANSI_NULLS указывает, как SQL Server обрабатывает операции сравнения с NULL ценности.
когда он установлен в ON С NULL с помощью = и приведет к ложному значению. И это стандартное поведение, определенное ISO. Поэтому для сравнения с нулевыми значениями нам нужно использовать значение NULL и не NULL.
когда он установлен в выкл С NULL using = и будет работать как обычно, т. е. NULL = NULL возвращает true и 1= NULL возвращает ложный.
SET ANSI_NULLS ON IF NULL = NULL PRINT 'same' ELSE PRINT 'different' --result: different SET ANSI_NULLS ON IF NULL IS NULL PRINT 'same' ELSE PRINT 'different' -- result: same --============================== SET ANSI_NULLS OFF IF NULL = NULL PRINT 'same' ELSE PRINT 'different' --result: same (now NULL = NULL works as 1=1) --The default behavior is ON in any database.
если
@Region- Это неnullзначение (скажем@Region = 'South') он не будет возвращать строки, где поле Region имеет значение null, независимо от значения ANSI_NULLS.ANSI_NULLS будет иметь значение только тогда, когда значение
@Regionиnull, т. е. когда ваш первый запрос по существу становится вторым.в этом случае ANSI_NULLS ON не вернет никаких строк (потому что
null = nullдаст неизвестное логическое значение (a.k.a.null)) и ANSI_NULLS OFF вернется любые строки, в которых Поле Region имеет значение null (потому чтоnull = nullдастtrue)
УСТАНОВИТЕ ANSI_NULLS НА
он возвращает все значения, включая нулевые значения в таблице
SET ANSI_NULLS off
оно заканчивается, когда столбцы содержат значения null
установить заполнение ANSI будет сделать нуль = нуль сравнения возвращают true. Например:
SET ANSI_NULLS OFF select * from sys.tables where principal_id = Nullвернет некоторый результат, как показано ниже: ZCWINVOICEDELIVERYTYPE 744547 NULL ZCEXPENSERPTSTATUSTRACK 2099048 NULL ZCVENDORPERMISSIONS 2840564 NULL ZCWOrgLevelClientFee 4322525 NULL
пока этот запрос не возвращает никаких результатов:
SET ANSI_NULLS ON select * from sys.tables where principal_id = Null
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 есть значения nonnull.
для электронной.г
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 !
Если ANSI_NULLS имеет значение " ON " и если мы применяем = , на значение столбца NULL при написании инструкции select, то он не вернет никакого результата .
пример
создать таблицу # tempTable(sn int, ename varchar (50))
вставить в #tempTable
выберите 1, 'Manoj'
ОБЪЕДИНЕНИЕ ВСЕХ
выберите 2, 'Pankaj'
ОБЪЕДИНЕНИЕ ВСЕХ
выберите 3, NULL
Союз Все
выберите 4, 'Lokesh'
ОБЪЕДИНЕНИЕ ВСЕХ
выберите 5, 'Gopal'
УСТАНОВИТЬ ANSI_NULLS НА
выберите * из #tempTable, где ename равно NULL -- (1 строка (ы) затронуты)
выберите * из #tempTable, где ename = NULL -- (0 строк (ов) затронуты)
выберите * из #tempTable, где ename NULL -- (0 строк (ов) затронуты)
SET ANSI_NULLS OFF
выбрать * из #поддающийся соблазну, где эмаль кулон имеет значение null -- (1 ряд(ов), пострадавших)
выберите * из #tempTable, где ename = NULL -- (1 строка (ы) затронуты)
выберите * из #tempTable, где ename не является NULL -- (4 строки (ы) затронуты)
выберите * из #tempTable, где ename NULL -- (4 строки (ы) затронуты)