[原创]SQLServer陷阱

hisi 2008-06-10 03:31:28
加精
本文旨在指出一些在使用SQLServer过程中容易犯的错误, 希望能给您带来帮助.
若没有特殊说明, 本文是指在MS SQLServer 2000简体中文版的默认配置环境中.

一, NULL与布尔数据类型
Transact-SQL中存在Boolean类型, if 后面的表达式的计算结果一般是Boolean类型, 但无法使用 declare 定义Boolean类型的变量.

Boolean数据类型有三种取值, TRUE, FALSE, UNKNOWN, 第3种取值通常会被人忽视从而导致逻辑错误.
默认情况下SET ANSI_NULLS为ON, 在逻辑表达式中如果你忽略了NULL的存在, 结果可能会异于你所想.
例1:

declare @a int
if (@a > 0)
set @a = 1
else if not (@a > 0)
set @a = 2
else
set @a = 3

结果@a的值应该是3, 因为NULL>0的值为UNKNOWN, NOT UNKNOWN的值还为UNKNOWN.
例2:

declare @a int
if @a = null
set @a = 1
else if @a = null or 1 = 1
set @a = 2
else
set @a = 3

结果@a的值应该是2, 因为NULL = 0的值为UNKNOWN, UNKNOWN or TRUE的值为TRUE.

二, 运行时错误与自动回滚事务
有些人认为一个批查询在执行中发生了错误, 这个查询就会中止, 其实是错误的.

例1:

declare @i int
set @i = 1 / 0
set @i = 1
select @i

结果会先报一个
服务器: 消息 8134,级别 16,状态 1,行 2
遇到被零除错误。
然后输出结果集 1.

例2:

set xact_abort on
declare @i int
set @i = 1 / 0
set @i = 1
select @i

结果只报错, 不会输出结果.

例3:
请在查询分析器中新建连接执行

create table table1(id int primary key)

begin tran
insert into table1 values (1)
insert into table1 values (1)
insert into table1 values (2)
commit tran

第二个insert会产生违反主键约束错误, 但是执行结束后你会发现事务已经提交并且table1中已经有两行记录1与2

例4:

set xact_abort on

create table table2(id int primary key)

begin tran
insert into table2 values (1)
insert into table2 values (1)
insert into table2 values (2)
commit tran

执行结束后, table2中没有记录, 说明事务已经回滚.

当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误

(如语法错误)不受 SET XACT_ABORT 的影响。
一般批查询中 SET XACT_ABORT 默认为 OFF, 隐式开启的事务如触发器中SET XACT_ABORT 默认为ON

未完...
...全文
2739 172 打赏 收藏 转发到动态 举报
写回复
用AI写文章
172 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenzhenNBA 2012-02-04
  • 打赏
  • 举报
回复
学习了
honghe521 2011-12-01
  • 打赏
  • 举报
回复
mark 学习
qcxabc 2011-08-31
  • 打赏
  • 举报
回复
收藏。
zjsomnus 2009-08-20
  • 打赏
  • 举报
回复
先记号起
zjsomnus 2009-08-18
  • 打赏
  • 举报
回复
支持 收藏了
zc_0101 2009-08-12
  • 打赏
  • 举报
回复

--已阅
select getdate()
/*
2009-08-12 14:02:42.233
*/
ailliy 2008-10-13
  • 打赏
  • 举报
回复
免费视频:
浪曦ASP.NET企业实战系列 http://down1.langsin.com/001.rar
浪曦NUnit详解视频 http://down1.langsin.com/002.rar
浪曦Struts 2应用开发详解 http://www.verycd.com/topics/210454
VIP视频:
浪曦Java常见笔试、面试题目深度剖析 http://down1.langsin.com/003.rar
浪曦J2EE测试实用指南http://down1.langsin.com/005.rar
浪曦Lucene视频教程 http://down1.langsin.com/006.rar
浪曦电脑维护项目 http://down1.langsin.com/007.rar
培训视频:
浪曦ExtJS视频之Grid控件 http://down1.langsin.com/008.rar
业务QQ:1050429531
loulou_ff 2008-10-05
  • 打赏
  • 举报
回复
学习收藏!
wwwprogramer 2008-08-28
  • 打赏
  • 举报
回复
不错,收藏下
hzs2006 2008-07-25
  • 打赏
  • 举报
回复
学习收藏!
zhnzzy 2008-07-10
  • 打赏
  • 举报
回复
不错,收藏下
gsl0029 2008-07-07
  • 打赏
  • 举报
回复
好贴.看看
billlyh 2008-07-07
  • 打赏
  • 举报
回复
ding !!!!!!!!!!!!!
chyliu 2008-07-05
  • 打赏
  • 举报
回复
學習中...
律己修心 2008-07-04
  • 打赏
  • 举报
回复
UP
wsndy5 2008-07-04
  • 打赏
  • 举报
回复
ceshi yi xia
yhtapmys 2008-07-03
  • 打赏
  • 举报
回复
wait
fellowcheng 2008-07-03
  • 打赏
  • 举报
回复
zwk_9 2008-07-03
  • 打赏
  • 举报
回复
很不错的帖子,顶一个
谁是谁的谁 2008-07-02
  • 打赏
  • 举报
回复
关注,
另有分散没?
加载更多回复(151)

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧