当我运行以下两个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')
返回什么?
不幸的是,这仍然不能解释为什么参数化选择返回与非参数化选择不同的内容