任何人都知道为什么类似下面的情况会在MSSQL 2005而不是MSSQL 2008上正常运行:
declare @X int = null;
select A, B, C from TABLE where X=@X
我没有详细说明,我有一个存储过程调用另一个存储过程,该过程采用硬编码Null作为参数之一,它在MSSQL2005上显然运行良好,但不是2008年。
答案 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)
答案 3 :(得分:-1)
设置ANSI_NULLS OFF GO
^^这使得存储过程按我预期的方式工作。