当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么在WHERE子句中使用TSQL变量会产生与使用相同值的常量不同的结果?》经验,为你挑选了1个好方法。

当我运行以下两个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')回报?

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



1> Nick.McDerma..:

哦,海SAP

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

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

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

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

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有