什么`SET ANSI_NULLS OFF`做什么?

时间:2009-01-04 23:01:54

标签: sql-server

SET ANSI_NULLS OFF做了什么?

4 个答案:

答案 0 :(得分:17)

From MSDN:

  

SQL-92标准要求等于(=)或不等于(<>)与空值的比较计算为FALSE。

     

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

     

SET ANSI_NULLS 关闭时,等于(=)和不等于(&lt;&gt;)比较运算符不符合SQL-92标准。使用WHERE column_name = NULL的SELECT语句返回column_name中具有空值的行。使用WHERE column_name <> NULL的SELECT语句返回列中具有非空值的行。此外,使用WHERE column_name <> XYZ_value的SELECT语句将返回非XYZ_value且不为NULL的所有行。

答案 1 :(得分:10)

它改变了NULL的行为方式。 ANSI中的NULL会产生类似

的内容

NULL = NULL - &gt;假

NULL <> NULL - &gt;假

关闭ANSI_NULLS,(NULL = NULL) - &gt;真。

答案 2 :(得分:0)

当打开时它不计算Null值并返回0.

启用此选项后,任何将值与null进行比较的查询都将返回0

实施例: SET ANSI_NULLS ON SELECT empname FROM emp1 WHERE phone = NULL

说明: 它将不返回任何内容,因为SET ANSI_NULLS为ON。

来源:

http://www.xpode.com/ShowArticle.aspx?ArticleId=599

谢谢,

罗希特夏尔

答案 3 :(得分:0)

SET ANSI_NULLS OFF指示服务器使用非标准语义评估涉及NULL的语句。

SET ANSI_NULLS OFF;
SELECT CASE WHEN NULL = NULL THEN 1 ELSE 0 END; -- Evaluates to 1 (bad!)
SET ANSI_NULLS ON;
SELECT CASE WHEN NULL = NULL THEN 1 ELSE 0 END; -- Evaluates to 0 (good!)

您应该永远不会使用SET ANSI_NULLS OFF的非标准语义设置创建新代码,因为:

  • 永远不需要,
  • 对于使用NULL与任何其他值(例如WHERE子句)不同处理时发生的富语义的数据库查询,与NULL进行比较的值应始终返回False / UNKNOWN,
  • 它使代码更难以维护,因为开发人员可能没有意识到它正在使用非标准设置,或者被它混淆,并且
  • Microsoft has warned在SQL Server的未来版本中,该设置将导致显式错误。