作者:herowang(让你望见影子的墙)
日期:2009.12.19
注: 转载请保留此信息
更多内容,请访问我的博客:blog.csdn.net/herowang
****************************************************/
SQL SERVER2005中关于NULL的设定
NULL处理时SQL SERVER中一个比较麻烦的事情,有许多处理可能因为NULL而得到一些预想不到的结果。NULL在数据库中一般有三层含义:1、该属性值不适合该实体;2、该实体还没有改属性;3、该实体有该属性,但是现在还不知道。
对于NULL的使用,和数据库的选项和会话的设置是息息相关的,也就是说不同的数据库的选项和会话的设置,对NULL的处理方式是不一样的。对于影响NULL处理的设置有如下几种:
一、ANSI_NULL_DEFT_ON 及ANSI_NULL_DEFT_OFF。
当该选项为OFF时,通过CREATE TABLE和ALTER TABLE创建的新列默认为NOT NULL,对应的数据库选项为ANSI NULL默认值为FALSE。当该选项为ON时,则默认值为NULL,对应的数据库选项为ANSI NULL默认值为TRUE。
【测试1】
SET ANSI_NULL_DFLT_ON OFF
go
create table test1(id int,col char(10))
查看该表的属性,可以看到该表的两列不为空;
【测试2】
SET ANSI_NULL_DFLT_ON _disibledevent=>
【测试7】
SET ANSI_NULLS off
go
select * from test where col=null
结果
ID COL
3 NULL
【测试8】
SET ANSI_NULLS _disibledevent=>
结果
四、SET ANSI_DEFAULTS
默认为ON,当启用 (ON) 时,该选项将启用下列设置:
SET ANSI_NULLS SET CURSOR_CLOSE_ON_COMMIT
SET ANSI_NULL_DFLT_ON SET IMPLICIT_TRANSACTIONS
SET ANSI_PADDING SET QUOTED_IDENTIFIER
SET ANSI_WARNINGS
【测试9】(建立数据库采用默认设置,并且没有自己改变过用户选项)
set ANSI_DEFAULTS on
GO
DBCC USEROPTIONS
结果:
SET OPTION
VALUE
TEXTSIZE
2147483647
LANGUAGE
简体中文
DATEFORMAT
YMD
DATEFIRST
7
LOCK_TIMEOUT
-1
QUOTED_IDENTIFIER
SET
ARITHABORT
SET
ANSI_NULL_DFLT_ON
SET
ANSI_WARNINGS
SET
ANSI_PADDING
SET
ANSI_NULLS
SET
CONCAT_NULL_YIELDS_NULL
SET
ISOLATION LEVEL
READ COMMITTED
【测试10】
set ANSI_DEFAULTS off
GO
DBCC USEROPTIONS
结果:
SET OPTION
VALUE
TEXTSIZE
2147483647
LANGUAGE
简体中文
DATEFORMAT
YMD
DATEFIRST
7
LOCK_TIMEOUT
-1
ARITHABORT
SET
CONCAT_NULL_YIELDS_NULL
SET
ISOLATION LEVEL
READ COMMITTED
五、注意事项
1、当进行修改数据库选项后,发现貌似不起作用,原因在于当进行查询的时候,会启动用户的选项,而该用户选项会覆盖数据库选项。用户选项可以使用DBCC USEROPTIONS
查看,或者在【查询/查询选项】中查看。可以设置ANSI_DEFAULTS为OFF状态(可以关闭某些选项),或者在【查询/查询选项】关闭某些选项。
2、在建立表的时候,建立在CREATE TABLE中显示的指定该列允许为空或者不为空,避免因为环境的设置而造成不必要的误解。
3、进行数据库编程的时候,最好显式的指定涉及到NULL的选项,来覆盖默认数据库选项的影响,或者避免不同的用户选项所带来的影响。
最新评论