T-SQL之SET ANSI_NULLS

      当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中包含非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍会返回零行。
      当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵守 ISO 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中包含空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中包含非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有不为 XYZ_value 也不为 NULL 的行。
      当 SET ANSI_NULLS 为 ON 时,所有对 null 值的比较均取值为 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 将忽略计算列或视图的索引值并解析选择操作,就好像表或视图没有这样的索引一样。

实例:

ContractedBlock.gif ExpandedBlockStart.gif Code
USE Test
GO
CREATE TABLE xmai
(
    id 
int null,
    name 
char(20null
)
INSERT INTO xmai VALUES (1984,NULL)
INSERT INTO xmai VALUES (2009,'HJ')
INSERT INTO xmai VALUES (NULL,'XMAI')
INSERT INTO xmai VALUES (2007,'MAIHUASHA')
GO

 

ContractedBlock.gif ExpandedBlockStart.gif Code
--1.设置ANSI_NULLS为ON时,返回零行
SET ANSI_NULLS ON
GO
SELECT*FROM xmai WHERE id=NULL
SELECT*FROM xmai WHERE id<>NULL
执行结果:
id          name
----------- --------------------
(0 行受影响)

id          name
----------- --------------------
(0 行受影响)

--2设置ANSI_NULLS为OFF时,等于 (=) 和不等于 (<>) 比较运算符不遵守 ISO 标准。

SET ANSI_NULLS OFF
GO
SELECT*FROM xmai WHERE id=NULL
SELECT*FROM xmai WHERE id<>NULL
执行结果:
id          name
----------- --------------------
NULL        XMAI                
(
1 行受影响)

id          name
----------- --------------------
1984        NULL
2009        HJ                  
2007        MAIHUASHA           
(
3 行受影响)

--3.使用WHERE column_name<>XYZ_value的SELECT语句返回所有不为XYZ_value也不为NULL的行。
SELECT*FROM xmai WHERE id<>1984
执行结果:
id          name
----------- --------------------
2009        HJ                  
2007        MAIHUASHA           

(
2 行受影响)

 

 

转载于:https://www.cnblogs.com/xmaiC/archive/2009/04/15/1436813.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值