ansi_nulls: некоторые способы проверить, похоже, не работают - PullRequest
2 голосов
/ 08 мая 2020

В документации указано, что флаг 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)

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Ваши запросы рассматривают две разные вещи.

Один - это база данных по умолчанию (может быть изменена с помощью ALTER DATABASE SET), а другой - то, что он установлен в текущем сеансе.

База данных по умолчанию практически бесполезна, так как все общие способы подключения к SQL Сервер устанавливают ANSI_NULLS на как описано ниже

Connection- параметры уровня, установленные с помощью оператора SET, переопределяют параметр базы данных по умолчанию для ANSI_NULLS. Клиенты ODB C и OLE DB по умолчанию задают для ANSI_NULLS параметр SET на уровне соединения для сеанса. Клиенты запускают оператор, когда вы подключаетесь к экземпляру SQL Server. Для получения дополнительной информации см. SET ANSI_NULLS.

0 голосов
/ 08 мая 2020

за сеанс:

set ansi_nulls on;

select sessionproperty('ANSI_NULLS');

select ansi_nulls
from sys.dm_exec_sessions
where session_id = @@spid;

select case when null=null then 0 else 1 end;
-------------
set ansi_nulls off;

select sessionproperty('ANSI_NULLS');

select ansi_nulls
from sys.dm_exec_sessions
where session_id = @@spid;

select case when null=null then 0 else 1 end;
...