【发布时间】: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