Sql server 具有空比较检查的T-SQL存储过程中的不一致性

Sql server 具有空比较检查的T-SQL存储过程中的不一致性,sql-server,tsql,Sql Server,Tsql,我有一个存储过程,其中包含 --cutting the declaration of various variables SELECT @val = id FROM dbo.example_table WHERE type=@type AND date=@date if @val = null insert record 在存储过程中使用空表执行此操作时,将插入记录,但在存储过程之外作为代码块执行此操作时,将不执行插入操作。还有一些SQL Server,无论是在存储过程内部还是外部,

我有一个存储过程,其中包含

--cutting the declaration of various variables
SELECT @val = id FROM dbo.example_table
WHERE type=@type AND date=@date

if @val = null
    insert record
在存储过程中使用空表执行此操作时,将插入记录,但在存储过程之外作为代码块执行此操作时,将不执行插入操作。还有一些SQL Server,无论是在存储过程内部还是外部,都不会在其上进行插入

有没有什么解释,为什么他可以在某些情况下工作,但不能在其他情况下工作?我知道执行比较的正确方法是
@val is NULL
,但我想知道
@val=NULL
是否在任何地方记录了完整性。

检查设置是否正确

这将返回一个

declare @var varchar(10) = null;

SET ANSI_NULLS ON
if (@var = null) select 'true';
else select 'false';
declare @var varchar(10) = null;

SET ANSI_NULLS OFF
if (@var = null) select 'true';
else select 'false';
这将返回一个true

declare @var varchar(10) = null;

SET ANSI_NULLS ON
if (@var = null) select 'true';
else select 'false';
declare @var varchar(10) = null;

SET ANSI_NULLS OFF
if (@var = null) select 'true';
else select 'false';

A会导致这个。。。(如果是这种情况,您应该删除它并使用文档化的方法来处理空值进行重写)您从不将空值与任何东西进行比较-use
is null