具有 null 比较检查的 T-SQL 存储过程中不一致



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

--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 服务器永远不会在其上进行插入,无论是在存储过程内部还是外部。

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

检查ANSI_NULLS设置。

这将返回一个 false

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

这将返回一个 true

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

最新更新