当我运行以下两个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;
Run Code Online (Sandbox Code Playgroud)
为什么是这样?这里发生了什么?我原本以为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;
Run Code Online (Sandbox Code Playgroud)
结果:
-------
456
-------
NULL
NULL
456
Run Code Online (Sandbox Code Playgroud)