【问题标题】:ansi_nulls: some ways to check it don't seem to workansi_nulls:一些检查它的方法似乎不起作用
【发布时间】:2020-05-08 14:18:15
【问题描述】:

documentation 声明数据库 ANSI_NULLS 标志控制在某些方面与 null 进行比较的行为。

我正在检查this stack overflow post 以检查如何确定(未设置)此标志的值。有趣的是,并非所有答案似乎都对我有用。

我的测试查询:

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 为 ON。

现在,检查选项:

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 会给出这个结果?

我的@@version 是:

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)

【问题讨论】:

  • 因为连接设置覆盖了数据库默认值
  • @Martin Smith 你能发布一个更详细的答案吗?如何检查连接设置?我想这个问题取决于所使用的应用程序,所以让我澄清一下我问的是 SSMS。
  • 我强烈建议不要关闭 ANSI NULL。无论如何,这样做的能力是要从 SQL Server 中删除,NULL = NULL 意味着 是真的。
  • 如果你想和NULL比较,我们这样写:** select * from x where EXISTS(SELECT txt INERSECT SELECT null) **
  • @Larnu 我同意你的意见。实际上,整个研究只是为了让我感到“安全”,因为我可以编写可以安全地假设此标志始终处于打开状态的代码(至少当没有人故意更改它时)

标签: sql-server tsql sql-null


【解决方案1】:

您的查询正在查看两个不同的内容。

一个是数据库默认值(可以用ALTER DATABASE SET更改)-另一个是当前会话中设置的值。

数据库默认值实际上没有用,因为所有连接到 SQL Server 的common 方式都在as described below 上设置了ANSI_NULLS

使用 SET 语句设置的连接级别设置 覆盖 ANSI_NULLS 的默认数据库设置。 ODBC 和 OLE DB 客户端发出连接级 SET 语句,将 ANSI_NULLS 设置为 默认情况下,会话为 ON。当您执行该语句时,客户端会运行该语句 连接到 SQL Server 的实例。有关详细信息,请参阅 SET ANSI_NULLS。

【讨论】:

    【解决方案2】:

    对于会话:

    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;
    

    【讨论】:

      猜你喜欢
      • 2012-08-25
      • 1970-01-01
      • 2023-02-04
      • 2019-12-21
      • 1970-01-01
      • 2021-11-27
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多