SET ANSI_NULLS (Transact-SQL)
指定与空值一起使用时的等于 (=) 和不等于 (<>) 比较运算符的 SQL-92 标准行为。
重要提示: |
---|
后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 |
语法
SET ANSI_NULLS { ON | OFF }
备注
当 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_value 也不为 NULL 的行。
注意: |
---|
SQL Server 是将空字符串解释为单个空格还是解释为真正的空字符串,由兼容级别设置控制。 如果兼容级别小于或等于 65,则 SQL Server 会将空字符串解释为单个空格。 如果兼容级别等于 70,则 SQL Server 会将空字符串解释为空字符串。 有关设置兼容级别的详细信息,请参阅 sp_dbcmptlevel (Transact-SQL)。 |
当 SET ANSI_NULLS 为 ON 时,所有对空值的比较均取值为 UNKNOWN。 当 SET ANSI_NULLS 为 OFF 时,如果数据值为 NULL,则所有数据对空值的比较将取值为 TRUE。 如果未指定 SET ANSI_NULLS,则应用当前数据库的 ANSI_NULLS 选项设置。 有关 ANSI_NULLS 数据库选项的详细信息,请参阅 ALTER DATABASE (Transact-SQL) 和设置数据库选项。
仅当某个比较操作数是值为 NULL 的变量或文字 NULL 时,SET ANSI_NULLS ON 才会影响比较。 如果比较双方是列或复合表达式,则该设置不会影响比较。
为使脚本按预期运行,不管 ANSI_NULLS 数据库选项或 SET ANSI_NULLS 的设置如何,请在可能包含空值的比较中使用 IS NULL 和 IS NOT NULL。
在执行分布式查询时应将 SET ANSI_NULLS 设置为 ON。
对计算列或索引视图创建或更改索引时,SET ANSI_NULLS 也必须为 ON。 如果 SET ANSI_NULLS 为 OFF,则针对表(包含计算列或索引视图的索引)的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。SQL Server 将返回一个错误消息,该错误消息会列出所有违反所需值的 SET 选项。 另外,在执行 SELECT 语句时,如果 SET ANSI_NULLS 为 OFF,则 SQL Server 将忽略计算列或视图的索引值并解析选择操作,就好像表或视图没有这样的索引一样。
注意: |
---|
ANSI_NULLS 是在处理计算列或索引视图的索引时必须设置为所需值的七个 SET 选项之一。 还必须将选项 ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER 和 CONCAT_NULL_YIELDS_NULL 设置为 ON,而必须将 NUMERIC_ROUNDABORT 设置为 OFF。 |
SQL Server 的 SQL Native Client ODBC 驱动程序和 SQL Native Client OLE DB 访问接口在连接时会自动将 ANSI_NULLS 设置为 ON。 该设置可以在 ODBC 数据源、ODBC 连接属性或 OLE DB 连接属性(它们在连接到 SQL Server 实例之前在应用程序中设置)中进行配置。 SET ANSI_NULLS 的默认值为 OFF。
当 SET ANSI_DEFAULTS 为 ON 时,将启用 SET ANSI_NULLS。
SET ANSI_NULLS 的设置是在执行或运行时设置,而不是在分析时设置。
权限
要求具有 public 角色的成员身份。
示例
以下示例使用等于 (=
) 和不等于 (<>
) 比较运算符对表中的 NULL
值和非空值进行比较。 该示例还表明,IS NULL
不受 SET ANSI
_NULLS
设置的影响。
-- Create table t1 and insert values.
CREATE TABLE t1 (a INT NULL)
INSERT INTO t1 values (NULL)
INSERT INTO t1 values (0)
INSERT INTO t1 values (1)
GO
-- Print message and perform SELECT statements.
PRINT 'Testing default setting'
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- SET ANSI_NULLS to ON and test.
PRINT 'Testing ANSI_NULLS ON'
SET ANSI_NULLS ON
GO
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- SET ANSI_NULLS to OFF and test.
PRINT 'Testing SET ANSI_NULLS OFF'
SET ANSI_NULLS OFF
GO
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- Drop table t1.
DROP TABLE t1
请参阅
参考
SET (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)
=(等于)(Transact-SQL)
IF...ELSE (Transact-SQL)
<>(不等于)(Transact-SQL)
SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
WHERE (Transact-SQL)
WHILE (Transact-SQL)