存储过程中raiserror后面的代码还能继续执行????!

mahongxi 2005-04-20 03:37:07
ALTER PROCEDURE PKG_TEST_TTT1
@ReceiverID VARCHAR(8000),
@R NUMERIC(10)
AS
BEGIN
SET NOCOUNT ON
--raiserror ('error',16,1) with NOWAIT
drop table asdfasdfasdfasdf
insert into dual(dummy) values('y')
return 1

SET NOCOUNT OFF

END
GO

后面的INSERT语句还是会执行地,这点不是搞死人了吗?
有没有什么开关控制RAISERROR后过程中断呢/
...全文
1356 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyinfo 2005-04-20
  • 打赏
  • 举报
回复
顶!
funsuzhou 2005-04-20
  • 打赏
  • 举报
回复
顶!
Well 2005-04-20
  • 打赏
  • 举报
回复
學習啊
在此只有幫樓主UP
xspf 2005-04-20
  • 打赏
  • 举报
回复
非法对象名确实不会回滚,但是象类型转换错误之类的错误却可以


zjcxc 元老 2005-04-20
  • 打赏
  • 举报
回复
要么你指定级别>=20的错误

set xact_abort on
begin tran
print 'aa'
raiserror('自定义错误',20,1) with log
print 'bb'
commit tran

/*--结果
aa
服务器: 消息 50000,级别 20,状态 1,行 4
自定义错误

连接中断
--*/
zjcxc 元老 2005-04-20
  • 打赏
  • 举报
回复
如果是处理手工raiserror产生的错误,既然你已经要手工产生错误了,说明错误你是知道的,自然该手工处理是否退出,而不应该依赖系统处理.
mahongxi 2005-04-20
  • 打赏
  • 举报
回复
试过了,即使SET XACT_ABORT 设为 ON,后面的代码还是会执行的.
xspf 2005-04-20
  • 打赏
  • 举报
回复
set xact_abort on --我们希望能自动回滚事务

begin tran
create table #t(id int)
insert #t select 1
insert #t
select 'a'
commit tran
go

select * from #t
rollback tran

文档中说了编译错误(如语法错误)不受 SET XACT_ABORT 的影响,如果不是编译错误,还是可以回滚的。
kylike 2005-04-20
  • 打赏
  • 举报
回复
来自MS帮助文档:
当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。

-----------------------------
在实际操作中 , 即使SET XACT_ABORT 设为 ON时,也只回滚产生错误的 Transact-SQL 语句。
mahongxi 2005-04-20
  • 打赏
  • 举报
回复
这样说来,我们原有的ORACLE业务,岂不是.......
wyb0026 2005-04-20
  • 打赏
  • 举报
回复
学习之
zjcxc 元老 2005-04-20
  • 打赏
  • 举报
回复
看看下面这个测试,也许能让你对sql的错误处理有所了解(要知道,sql 的错误处理功能是很弱的)

--下面演示了SQL错误处理的脆弱性
--邹建

--演示1
--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'

select * from newid()
if @@error<>0
print '发生错误2'
go

--调用
exec p1
go

--删除测试
drop proc p1

/*--测试结果

服务器: 消息 8134,级别 16,状态 1,过程 p1,行 6
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 10
对象名 'newid' 无效。

--*/


/*--结论1:

错误1,不是严重的错误,所以SQL会执行下去
错误2,属于严重的错误,所以SQL没有执行下去,因为没有第二个print的结果

--*/



--演示2,存储过程嵌套调用中的错误

--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'

select * from newid()
if @@error<>0
print '发生错误2'
go

--测试的存储过程2
create proc p2
as
exec p1

if @@error<>0
print '调用 存储过程1 异常结束'
else
print '调用 存储过程1 正常结束'
go

--调用
exec p2
go

--删除测试
drop proc p1,p2

/*--测试结果

服务器: 消息 8134,级别 16,状态 1,过程 p1,行 8
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 12
对象名 'newid' 无效。
调用 存储过程1 异常结束
--*/


/*--结论2:

被调用的存储过程发生严重错误时,调用它的存储过程可以捕获错误,并可以继续执行下去
--*/



--演示3,更严重的错误,无法用 set xact_abort on 来自动回滚事务
set xact_abort on --我们希望能自动回滚事务
begin tran
create table #t(id int)
insert #t select 1
select * from newid()
commit tran
go

select * from #t
rollback tran
/*--测试结果


(所影响的行数为 1 行)

服务器: 消息 208,级别 16,状态 1,行 5
对象名 'newid' 无效。

id
-----------
1

(所影响的行数为 1 行)
--*/

/*--结论3:

我们希望 set xact_abort on 可以实现出错时自动回滚事务
但结果令我们希望,出错时,事务并没有被回滚
因为我们查询到了#t的结果,而且最后的回滚语句也并没有报错
--*/
zjcxc 元老 2005-04-20
  • 打赏
  • 举报
回复
sql的错误处理机制是这样原.
sh_zll 2005-04-20
  • 打赏
  • 举报
回复
raiserror ('error',16,1) with NOWAIT后面加一个return -1试一下
wyb0026 2005-04-20
  • 打赏
  • 举报
回复
ALTER PROCEDURE PKG_TEST_TTT1
@ReceiverID VARCHAR(8000),
@R NUMERIC(10)
AS
BEGIN
SET NOCOUNT ON
raiserror ('error',16,1) with NOWAIT
return --加一个这个东东
drop table asdfasdfasdfasdf
insert into dual(dummy) values('y')
return 1

SET NOCOUNT OFF

END
GO
lxysjl 2005-04-20
  • 打赏
  • 举报
回复
应该不行吧
mahongxi 2005-04-20
  • 打赏
  • 举报
回复
自已顶一顶.

34,837

社区成员

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

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