当我运行以下两个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
Nick.McDerma.. 5
哦,海SAP
我想这是因为你有 SET ANSI_NULLS OFF;
如果你有,SET ANSI_NULLS ON;
你会发现他们返回相同的东西
什么select sessionproperty('ANSI_NULLS')
回报?
不幸的是,这仍然无法解释为什么参数化选择返回与非参数化选择不同的东西
哦,海SAP
我想这是因为你有 SET ANSI_NULLS OFF;
如果你有,SET ANSI_NULLS ON;
你会发现他们返回相同的东西
什么select sessionproperty('ANSI_NULLS')
回报?
不幸的是,这仍然无法解释为什么参数化选择返回与非参数化选择不同的东西