Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server ansi_nulls:一些检查它的方法似乎不起作用_Sql Server_Tsql_Sql Null - Fatal编程技术网

Sql server ansi_nulls:一些检查它的方法似乎不起作用

Sql server ansi_nulls:一些检查它的方法似乎不起作用,sql-server,tsql,sql-null,Sql Server,Tsql,Sql Null,声明数据库ANSIU NULLS标志控制在某些方面与null进行比较的行为 我正在检查如何确定不设置此标志的值。有趣的是,并不是所有的答案都适合我 我的测试查询: 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 selec

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

我正在检查如何确定不设置此标志的值。有趣的是,并不是所有的答案都适合我

我的测试查询:

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_空值。预料之中

3. 从sys.databases中选择is_ansi_nulls_,其中name='MyDatabaseName'

返回0。我没想到会这样

4. dbcc用户选项

结果集包括一行,其中[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)

您的查询着眼于两个不同的方面

一个是可以使用ALTER database SET更改数据库默认值,另一个是在当前会话中设置的默认值

数据库默认设置实际上是无用的,因为所有连接到SQL Server的方法都将ANSI_设置为空

使用set语句设置的连接级别设置 覆盖ANSI_NULL的默认数据库设置。ODBC与oledb 客户端发出连接级别集语句,将ANSI_null设置为 默认情况下,为会话启用。客户机在您 连接到SQL Server的实例。有关详细信息,请参见集合 ANSI_空值

本届会议:

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;

因为连接设置会覆盖数据库default@Martin史密斯:你能给我一个更详细的答复吗?如何检查连接设置?我想这个问题取决于所使用的应用程序,所以让我澄清一下,我问的是SSM。但是,我强烈建议永远不要关闭ANSI NULL。不管怎样,这样做的功能都将从SQL Server中删除,NULL=NULL意味着不正确。如果您想与NULL进行比较,那么让我们这样写:**select*from x where exists select txt in sect select NULL**@Larnu我同意您的意见。事实上,这整个研究只是为了让我感到安全,我可以编写代码,可以安全地假设这个标志始终处于打开状态,至少在没有人故意更改它的情况下
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;