MSSQL变量= null

时间:2016-01-19 16:24:18

标签: sql sql-server null

任何人都知道为什么类似下面的情况会在MSSQL 2005而不是MSSQL 2008上正常运行:

declare @X int = null;

select A, B, C from TABLE where X=@X

我没有详细说明,我有一个存储过程调用另一个存储过程,该过程采用硬编码Null作为参数之一,它在MSSQL2005上显然运行良好,但不是2008年。

4 个答案:

答案 0 :(得分:1)

无论您使用的是哪个版本的SQL,代码都写得不好,因为NULL永远不会“等同于”任何东西(甚至是它自己)。它是“未知的”,所以它是否等于(或大于或小于等)另一个值也是“未知”。

可能影响此行为的一件事是ANSI_NULLS的设置。如果您的2005服务器(或至少该连接)将ANSI_NULLS设置为“OFF”,那么您将看到您的行为。对于存储过程,设置取决于创建存储过程的时间。尝试使用以下内容重新创建存储过程:

SET ANSI_NULLS ON
GO

你可能会看到与2008年相同的结果。

您应该使用以下内容更正代码以正确处理NULL值:

WHERE X = @X OR (X IS NULL AND @X IS NULL)

WHERE X = COALESCE(@X, X)

具体细节取决于您的业务需求。

答案 1 :(得分:1)

这可能是由于您在两台服务器中的ansi_null设置。

  

当SET ANSI_NULLS为ON 时,使用WHERE的SELECT语句   column_name = NULL即使存在空值,也返回零行   列名。使用WHERE column_name<>的SELECT语句空值   即使column_name中存在非空值,也会返回零行。

     

当SET ANSI_NULLS为OFF 时,等于(=)和不等于(<>)   比较运算符不遵循SQL-92标准。一个选择   使用WHERE column_name = NULL的语句返回的行   在column_name中具有空值。使用WHERE的SELECT语句   column_name<> NULL返回具有非空值的行   柱。此外,使用WHERE column_name<>的SELECT语句   XYZ_value返回非XYZ_value且不是XYZ_value的所有行   NULL。

您可以在此处找到详细信息:https://msdn.microsoft.com/en-us/library/ms188048(v=sql.90).aspx

答案 2 :(得分:0)

试试这个:

select A, B, C from TABLE where X IS NULL

原始查询未返回预期结果的原因解释为here

答案 3 :(得分:-1)

设置ANSI_NULLS OFF GO

^^这使得存储过程按我预期的方式工作。