IF EXISTS(SELECT * FROM sys.objects WHERE type='p' AND name='test1abc')
DROP PROC test1abc
GO
create proc [dbo].[test1abc] (@pat_in_no char(20))
as
declare @pat_id char(26),@ret int
if not exists(select * from patients where pat_in_no = @pat_in_no) return -1 --传入参数找不到信息
BEGIN TRANSACTION
declare cur cursor for
select pat_id from patients where pat_in_no = @pat_in_no
select @pat_id = ''
open cur
while 1 = 1
begin
fetch next from cur into @pat_id
if @@FETCH_STATUS<>0 break
BEGIN TRANSACTION
insert into test
values (@pat_id)
--插入失败处理
IF @@ERROR <> 0 GOTO ERROR_PROC
---执行第二个存储过程
--判断返回值
--@ret = 另一存储过程返回值
select @ret = -1 --假设一个返回值值得????为什么执行
--ROLLBACK TRANSACTION报错?????????
if @ret > 0
COMMIT TRANSACTION
else
begin
SELECT @ret
ROLLBACK TRANSACTION
end
end
close cur --关闭游标
DEALLOCATE cur --删除游标
COMMIT TRANSACTION
return
ERROR_PROC:
close cur --关闭游标
DEALLOCATE cur --删除游标
ROLLBACK TRANSACTION
select @pat_id+'失败'
return
执行exec [test1abc]'00',@ret = -1 回滚。在查询分析器报错:
消息 3902,级别 16,状态 1,过程 test1abc,第 43 行
COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
------解决方案--------------------
sql 不支持嵌套事务
------解决方案--------------------
在嵌套事务中 rollback 将会回滚所有事务
可用@@trancount 判断嵌套层数,commit transaction 会使@@trancount相应的减少1
------解决方案--------------------
sql支持嵌套事务,但是你的begin tran 和commit要配对,rollback会回滚整个事务,你可以看看你那里没有配对的,而且错误判断也不够
------解决方案--------------------
分段调试 分段查看事务的匹配情况。