DECLARE @val CHAR(4)
If @val IS NULL
PRINT 'TRUE'
ELSE
PRINT 'FALSE'
SET @val = NULL
If @val IS NULL
PRINT 'TRUE'
ELSE
PRINT 'FALSE'
上面两个表达式都会返回 TRUE, 原因是 IS NULL 同时比较地址和值是不是未知的。
ANSI_NULLS
SET ANSI_NULLS (ON|OFF)
环境变量 SET ANSI_NULLS (ON|OFF) 的设置对 “= NULL”的表达式会有很大的影响,下面的段落摘录自sql server 的帮助,它很好的解释了这一因素。(SET ANSI_NULLS 详细的说明参考sql server 帮助)
SQL-92 标准要求对空值的等于 (=) 或不等于 (<>) 比较取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍返回零行。
当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中含有空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中含有非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有非 XYZ 值和非 NULL的行。
当 SET ANSI_NULLS 为 ON 时,所有对空值的比较均取值为 UNKNOWN。当 SET ANSI_NULLS 为 OFF 时,如果数据值是 NULL,则所有数据对空值的比较将取值为 TRUE。如果未指定,则应用当前数据库的 ANSI nulls 选项的设置。
为使脚本按预期运行,不管 ANSI nulls 数据库选项或 SET ANSI_NULLS 的设置是什么,在可能包含空值的比较中使用 IS NULL 和 IS NOT NULL。
所以我们在需要判断NULL的时候最好使用 IS NULL 和 IS NOT NULL。尽量避免使用 = NULL 和 <> NULL, 因为后者会产生非预期的效果。
在 SET ANSI_NULLS 设置不同时下面的 sql 语句会产生不同结果:
SELECT * FROM t1 WHERE a = NULL
SELECT * FROM t1 WHERE a <> NULL
SELECT * FROM t1 WHERE a IS NULL
作者: 杨曾荣 时间: 2012-3-18 14:05
徐振升 发表于 2012-3-17 09:35
当我们在 sql server 中用 DECLARE 申明一个变量时, sql server 将会把变量存储在SQLs 内存空间的变量列表 ...