В документации указано, что флаг ANSI_NULLS базы данных управляет поведением сравнений с нулевым значением на какой-то стороне.
Я проверял это сообщение о переполнении стека , чтобы проверить, как до определить (не установить) значение этого флага. Интересно, что не все ответы, похоже, у меня сработали.
Мой тестовый запрос:
create table x(id int,txt nvarchar(max))
insert x(id,txt) values (1,'not null here'),(2,null)
select * from x
--query 1
select * from x where txt=null
--query 2
select * from x where txt<>null
На выходе возвращаются два пустых набора результатов. Отсюда я могу логически вывести ANSI_NULLS в моей базе данных.
Теперь к параметрам проверки:
1
select databasepropertyex('MyDatabaseName', 'IsAnsiNullsEnabled')
Возвращает 0. Я этого не ожидал.
2
DECLARE @options INT
SELECT @options = @@OPTIONS
IF ( (32 & @options) = 32 ) PRINT 'ANSI_NULLS'
Выводит "ANSI_NULLS". Ожидается.
3
SELECT is_ansi_nulls_on FROM sys.databases WHERE name = 'MyDatabaseName'
Возвращает 0. Я этого не ожидал.
4
dbcc useroptions
Набор результатов включает строку с [Set Option] = 'ansi_nulls' и [Value] = 'Set'. Ожидается.
Почему варианты 1 и 3 дают мне такой результат?
Моя версия @@:
Microsoft SQL Server 2017 (RTM-GDR) (KB4505224) - 14.0.2027.2 (X64)
Jun 15 2019 00:26:19
Copyright (C) 2017 Microsoft Corporation
Developer Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)