如何在存储过程加事务回滚

呦呦 2011-08-24 11:44:47

CREATE PROCEDURE [dbo].[pos_Qianshou]
(
@orderID varchar(32),
@Signee varchar(10),--签收人
@delivetyName varchar(10),--操作员名称
@deliveryDep varchar(20)--站点
)
AS
begin
--定义变量------------------
declare @tnid int,@count int,@orderMoney money,@Sign varchar(10),@Saccount money
,@oldPoster varchar(20),@mstate int
-------------------------------------------------查询订单信息----------------------
select @tnid=ord.tnid,@Saccount=ord.Yaccount,@oldPoster=Poster,@mstate=mstate from orderinfo ord
where ord.orderid=@orderID
----------------------------------------------获取报单表数据----------------
select @count=count(tnid) from baodan where tnid=@tnid


if(@mstate>=2 and @mstate<=5)
begin

if(@oldPoster!=@delivetyName)--不是同一个投递员
begin

--修改订单表投递员
update orderinfo set poster=@delivetyName,Station=@deliveryDep,Station_HQ=@deliveryDep where tnid=@tnid
-------
update arrive_sp set station=@deliveryDep,station_hq=@deliveryDep,poster=@delivetyName where tnid=@tnid

end
------------------------------------------------------------------------------------------
if(@count>0)--如果此单在报单结算表中存在,则修改实收金额
begin
if(@oldPoster!=@delivetyName)--不是同一个投递员
begin
update baodan set [Sign]=@Signee,Soperater=@delivetyName,BMDATE=getdate(),oldPoster=@oldPoster
where tnid=@tnid
end
else begin
--如果此单在报单结算表中存在,则修改实收金额
update baodan set [Sign]=@Signee,Soperater=@delivetyName,BMDATE=getdate()
where tnid=@tnid
end

end
else begin
--在报单结算表中添加一条
declare @ArriveTime datetime,@LeadTime datetime,@Yaccount money

select @ArriveTime=ar.ArriveTime,@LeadTime=ar.LeadTime,@Yaccount=ord.Yaccount
from orderinfo ord
left join arrive_sp ar on ar.tnid=ord.tnid
where ord.orderid=@orderid


-------------------------添加----------------------------
Insert into baodan(tnid,ArriveTime,LeadTime,BackTIME,Yaccount,Saccount,Sign_status
,[Sign],Soperater,BMDATE,oldPoster)
Values(@tnid,@ArriveTime,@LeadTime,getdate(),@Yaccount,@orderMoney,0,
@Signee,@delivetyName,getdate(),@delivetyName)
end


--最后修改orderinfo表中Status,Mstate
update orderinfo set Status='T',Mstate=6,tmemo='pos'+tmemo where tnid=@tnid

end

end
GO


麻烦高手有空过来帮帮忙吧
...全文
421 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
geniuswjt 2011-08-24
  • 打赏
  • 举报
回复
ps: mm的注释习惯很好,继续保持
geniuswjt 2011-08-24
  • 打赏
  • 举报
回复

begin tran
...
commit tran

if @@error>0
rollback
--小F-- 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 happy_gril 的回复:]
大家看我改的对不,是不是这样就可以保证每句都能修改成功,要么全修改,要么全不修改

SQL code

CREATE PROCEDURE [dbo].[pos_Qianshou]
(
@orderID varchar(32),
@Signee varchar(10),--签收人
@delivetyName varchar(10),--操作员名称
……
[/Quote]
这个没有问题的
--小F-- 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 perfectaction 的回复:]
加上set xact_abort on ,就无法判断@@error了。
如果不加set xact_abort on,就需要在每一个insert/update/delete后都要判断@@error.
[/Quote]
++
天-笑 2011-08-24
  • 打赏
  • 举报
回复

CREATE PROCEDURE [dbo].[pos_Qianshou]
(
@orderID varchar(32),
@Signee varchar(10),--签收人
@delivetyName varchar(10),--操作员名称
@deliveryDep varchar(20)--站点
)
AS
begin
begin tran --开启事务
begin try
......

commit tran -- 提交事务
end try
begin catch -- 捕获异常
......
rollback tran -- 回滚事务
end catch

end


天-笑 2011-08-24
  • 打赏
  • 举报
回复


CREATE PROCEDURE [dbo].[pos_Qianshou]
(
@orderID varchar(32),
@Signee varchar(10),--签收人
@delivetyName varchar(10),--操作员名称
@deliveryDep varchar(20)--站点
)
AS
begin
begin tran
begin try
......

commit tran
end try
begin catch
......
rollback tran
end catch

end

nzperfect 2011-08-24
  • 打赏
  • 举报
回复
加上set xact_abort on ,就无法判断@@error了。
如果不加set xact_abort on,就需要在每一个insert/update/delete后都要判断@@error.
呦呦 2011-08-24
  • 打赏
  • 举报
回复
楼上的,用不用再判断每一个@@error
nzperfect 2011-08-24
  • 打赏
  • 举报
回复
8楼没有问题了。
呦呦 2011-08-24
  • 打赏
  • 举报
回复
大家看我改的对不,是不是这样就可以保证每句都能修改成功,要么全修改,要么全不修改

CREATE PROCEDURE [dbo].[pos_Qianshou]
(
@orderID varchar(32),
@Signee varchar(10),--签收人
@delivetyName varchar(10),--操作员名称
@deliveryDep varchar(20)--站点
)
AS
set xact_abort on
begin TRAN

--定义变量------------------
declare @tnid int,@count int,@orderMoney money,@Sign varchar(10),@Saccount money
,@oldPoster varchar(20),@mstate int,@numError int
-------------------------------------------------查询订单信息----------------------
select @tnid=ord.tnid,@Saccount=ord.Yaccount,@oldPoster=Poster,@mstate=mstate from orderinfo ord
where ord.orderid=@orderID
----------------------------------------------获取报单表数据----------------
select @count=count(tnid) from baodan where tnid=@tnid


if(@mstate>=2 and @mstate<=5)
begin--开始

if(@oldPoster!=@delivetyName)--不是同一个投递员
begin

--修改订单表投递员
update orderinfo set poster=@delivetyName,Station=@deliveryDep,Station_HQ=@deliveryDep where tnid=@tnid
-------
update arrive_sp set station=@deliveryDep,station_hq=@deliveryDep,poster=@delivetyName where tnid=@tnid

end
------------------------------------------------------------------------------------------
if(@count>0)--如果此单在报单结算表中存在,则修改实收金额
begin
if(@oldPoster!=@delivetyName)--不是同一个投递员
begin
update baodan set [Sign]=@Signee,Soperater=@delivetyName,BMDATE=getdate(),oldPoster=@oldPoster
where tnid=@tnid
end
else begin
--如果此单在报单结算表中存在,则修改实收金额
update baodan set [Sign]=@Signee,Soperater=@delivetyName,BMDATE=getdate()
where tnid=@tnid
end

end
else begin
--在报单结算表中添加一条
declare @ArriveTime datetime,@LeadTime datetime,@Yaccount money

select @ArriveTime=ar.ArriveTime,@LeadTime=ar.LeadTime,@Yaccount=ord.Yaccount
from orderinfo ord
left join arrive_sp ar on ar.tnid=ord.tnid
where ord.orderid=@orderid


-------------------------添加----------------------------
Insert into baodan(tnid,ArriveTime,LeadTime,BackTIME,Yaccount,Saccount,Sign_status
,[Sign],Soperater,BMDATE,oldPoster)
Values(@tnid,@ArriveTime,@LeadTime,getdate(),@Yaccount,@orderMoney,0,
@Signee,@delivetyName,getdate(),@delivetyName)
end


--最后修改orderinfo表中Status,Mstate
update orderinfo set Status='T',Mstate=6,tmemo='pos'+tmemo where tnid=@tnid

end--结束

COMMIT TRAN
GO

呦呦 2011-08-24
  • 打赏
  • 举报
回复
set xact_abort on这个怎么用?
xjxx168 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 geniuswjt 的回复:]
SQL code


begin tran
...
commit tran

if @@error>0
rollback
[/Quote]正解
quna117 2011-08-24
  • 打赏
  • 举报
回复

set xact_abort on
baiynije 2011-08-24
  • 打赏
  • 举报
回复
@@error 返回最後語句的錯誤信息,應在每個修改語句後判斷。
呦呦 2011-08-24
  • 打赏
  • 举报
回复
楼上的,@@error这个可以把每一个修改语句的返回全部判断一遍吗?

34,594

社区成员

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

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