不明白 为什么 '存储过程' 要有 RETRUN ,这不是 破坏 "数据完整性" 吗? 存储过程明明是为"数据完整性"服务的,为什么要有REturn呢?return可以从查询或过程中无条件退出.可是当return退出后,在return之前的语句执行了并没有回滚回来,这不就不保证,"存储过程"作为一个操作单元执行了吗?要么成功全部执行SQL语名;要么失败,所有语句都不执行.???为什么要有return呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不一定所有存储过程都要用return,如果你想让所有语句中某条不成功其余全部回滚,应该使用事务控制. 建议楼主不要仅仅从字面上去理解,return不是乱用的,得符合业务逻辑才行。象你说的:要么成功全部执行SQL语名;要么失败,所有语句都不执行,这肯定要用到事务,如果成功了,那肯定是commit tran 然后returun ;如果失败的话,肯定要rollback tran,然后return. 两位楼上的朋友,我没有说事务,我是说在"存储过程"中的return,它不是破坏存储过程了完整性了吗 你从哪本书看书看的,说存储过程是原子性的。ACID只要不声明begin tran 就单独执行各自的。比如存储过程里面有两个更新语句。有可能一句执行,一句失败。 假如在一个存储过程中有insert into table1 (id) values (1) --这是对的(A)insert into table1 (id) values ('abc')---这是错的(B)insert into table1 (id) values (3) --这个就不会再执行了,对不,而(A)是被执行了,并且没有被回滚是不?我没说错哦?这不是原子操作吗? 假如在一个存储过程中有 insert into table1 (id) values (1) --这是对的(A) insert into table1 (id) values ('abc')---这是错的(B) insert into table1 (id) values (3) --这个就不会再执行了,对不,而(A)是被执行了,并且没有被回滚是不? 我没说错哦?这不是原子操作吗? ----------------如果存储过程执行出错时,公用变量@@errorno会<>0如果是启动了事务可用以下语句回滚exec 存储过程if @@error<>0 --执行失败时回滚 rollback tran 基本上,基于过程的语言都有return的功能其实return相应于goto到结束goto l1......语句...语句....l1: --结束 楼主可以这样来看下这两者的区别:create proc p1 --没有使用事务asinsert into table1 (id) values (1) insert into table1 (id) values ('abc')insert into table1 (id) values (3) --create proc p2 --使用了事务asbegin tran insert into table1 (id) values (1) insert into table1 (id) values ('abc')insert into table1 (id) values (3) commit tran两者的区别是第一个存储过程的第一个insert语句是可以被执行的,也就是说能够向数据库插入一条数据,而第二个是不能插入的。所以第一个存储过程并不是楼主所理解的原子操作。而是因为当执行insert into table1 (id) values ('abc')的时候出错,那么整个存储过程就跳出了,终止了存储过程的执行。但是第一条已经执行了,是不撤销的。原子操作是里面的操作要么全部执行,要么一个都不执行,所以存储过程如果不声明为事务的话,不是一个原子操作。 存储过程不加事务的话还用return么 存储过程就是SQL的一种编程,你觉得程序里会没用return嘛?return是控制程序的。数据完整性是事务的一种特性,要么提交,要么回滚。 怎么在SQL SERVER2005中查看日志信息 SQLSERVER 触发器 监控表删除的数据 并做记录 怎样在企业管理器中查看自定义的函数 sql 2个表查询问题 奇怪,exec sp_password更改密码不成功. 请问如何防治SQL注入攻击? SQL server 2000 sp3 装不上。。急啊 master..xp_cmdshell 导出txt每行以逗号结尾?怎么实现 如何提高查询和统计数据的速度?超高手解答 怎样在已存在的表中删除一列? 字符串转换为表达式的问题 windows下mysql编程时的注意事项
象你说的:要么成功全部执行SQL语名;要么失败,所有语句都不执行,这肯定要用到事务,如果成功了,那肯定是
commit tran 然后returun ;如果失败的话,肯定要rollback tran,然后return.
你从哪本书看书看的,说存储过程是原子性的。ACID
只要不声明begin tran 就单独执行各自的。
比如存储过程里面有两个更新语句。
有可能一句执行,一句失败。
insert into table1 (id) values (1) --这是对的(A)
insert into table1 (id) values ('abc')---这是错的(B)
insert into table1 (id) values (3) --这个就不会再执行了,对不,而(A)是被执行了,并且没有被回滚是不?我没说错哦?这不是原子操作吗?
insert into table1 (id) values (1) --这是对的(A)
insert into table1 (id) values ('abc')---这是错的(B)
insert into table1 (id) values (3) --这个就不会再执行了,对不,而(A)是被执行了,并且没有被回滚是不? 我没说错哦?这不是原子操作吗?
----------------
如果存储过程执行出错时,
公用变量@@errorno会<>0
如果是启动了事务
可用以下语句回滚
exec 存储过程
if @@error<>0 --执行失败时回滚
rollback tran
其实return相应于goto到结束goto l1......
语句...
语句....
l1: --结束
create proc p1 --没有使用事务
asinsert into table1 (id) values (1)
insert into table1 (id) values ('abc')
insert into table1 (id) values (3) --
create proc p2 --使用了事务
as
begin tran
insert into table1 (id) values (1)
insert into table1 (id) values ('abc')
insert into table1 (id) values (3)
commit tran两者的区别是第一个存储过程的第一个insert语句是可以被执行的,也就是说能够向数据库插入一条数据,而第二个是不能插入的。
所以第一个存储过程并不是楼主所理解的原子操作。而是因为当执行insert into table1 (id) values ('abc')的时候出错,那么整个存储过程就跳出了,终止了存储过程的执行。但是第一条已经执行了,是不撤销的。
原子操作是里面的操作要么全部执行,要么一个都不执行,所以存储过程如果不声明为事务的话,不是一个原子操作。