为什么在 WHERE 子句中使用 TSQL 变量会产生与使用相同值的常量不同的结果



当我运行以下两个SQL语句(SQL Server 2008 R2)时,我得到不同的结果。第一个排除 pernr 为 NULL 的行;第二个包括它们。

SELECT pernr FROM tbl
WHERE pernr <> 123;
DECLARE @input int = 123; 
SELECT pernr FROM tbl
WHERE pernr <> @input;

这是为什么呢?这是怎么回事?我本以为 SQL Server 会用值替换我的变量并以相同的方式评估这些查询,但显然不是!我正在 SSMS 中运行这些。

下面是一个重现脚本:

SET ANSI_NULLS OFF;
CREATE TABLE tbl (pernr INT NULL);
GO
INSERT INTO tbl (pernr)
VALUES (NULL)
    ,(123)
    ,(NULL)
    ,(456);

SELECT pernr FROM tbl
WHERE pernr <> 123;
DECLARE @input int = 123; 
SELECT pernr FROM tbl
WHERE pernr <> @input;

结果:

-------
456

-------
NULL
NULL
456

Oh Hai SAP

我想这是因为你有SET ANSI_NULLS OFF;

如果你有SET ANSI_NULLS ON;你会发现他们返回同样的东西

select sessionproperty('ANSI_NULLS')返回什么?

不幸的是,这仍然不能解释为什么参数化选择返回与非参数化选择不同的内容

最新更新