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

时间:2017-01-12 01:25:43

标签: sql sql-server

当我运行以下两个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中运行这些。

这是一个repro脚本:

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

1 个答案:

答案 0 :(得分:5)

Oh Hai SAP

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

如果你有SET ANSI_NULLS ON;,你会发现他们会返回相同的内容

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

不幸的是,这仍然无法解释为什么参数化选择会返回与非参数化的

不同的东西