日期:2014-05-18  浏览次数:20812 次

存储过程问题:EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句
各位大虾,我用SQL做了一个存储过程,调试的时候老是提示出错,详细错误如下:
[Microsoft][ODBC SQL Server Driver][SQL Server]EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。原计数 = 0,当前计数 = 1。

我的存储过程如下:

CREATE proc dbo.Fee_Ex

@ReturnMsg int output --返回值 大于0表示成功 0表示不处理 负数表示失败

AS

--Set @ReturnMsg=0
--set @Remark='OK成功'
declare @lordname varchar(50) --用户名
declare @lordAccount varchar(10) --用户帐号
declare @Functype varchar(4) --业务类型
declare @lordnumb varchar(12) --主叫号
declare @benumb varchar(18) --被叫号
declare @starttime datetime --接通时间
declare @endtime datetime --结束时间
declare @Usetime datetime --使用时间
declare @timelong int --时长(秒)
declare @expenses int --费用
declare @Fee int --计费费率
declare @FeeTmp int --计费费率
declare @endtimeTmp datetime --结束时间
declare @pay int --金额
declare @tolltype int --付费类型
declare @id int --临时表话单ID
declare @ErrorCNT int --错误数

SET @ErrorCNT=0
WHILE 1=1  
BEGIN
begin TRANSACTION---***添加事务
Set @id=-1
select top 1 @lordname=lordname,@lordAccount=lordAccount,@Functype=Functype,@id=[id],@benumb=benumb,@lordnumb=lordnumb,@endtime=endtime,@starttime=starttime,@expenses=Fee,@timelong=long FROM corp_excess WHERE isOK=0
if @id=-1
break
Set @FeeTmp=-99999
select @FeeTmp=expenses,@endtimeTmp=endtime from corp_qd where benumb=@benumb and Functype=@Functype and starttime=@starttime and endtime>=@endtime
if @FeeTmp<>-99999 --找到已经存储的话单清单,且结束时间比上报的错误话单还晚则直接返回
-- DELETE FROM corp_excess WHERE id=@id --删除该临时话单
UPDATE corp_excess SET isOK=2 WHERE [id]=@id
else
begin
Set @FeeTmp=-99999
select @FeeTmp=expenses,@endtimeTmp=endtime from corp_qd where benumb=@benumb and Functype=@Functype and starttime=@starttime and endtime<=@endtime
if @FeeTmp<>-99999 --找到已经存储的话单清单但是结束时间小于上报的错误话单结束时间则以上报的为准,进行更新
  begin
  update corp_qd set expenses=@expenses,endtime=@endtime,timelong=@timelong,Usetime=@starttime where benumb=@benumb and Functype=@Functype and starttime=@starttime
  select @pay=pay from corp_zh where lordname=@lordname --查询余额
  update corp_zh set pay=(@pay-(@expenses-@FeeTmp)) where lordname=@lordname --更新余额
-- DELETE FROM corp_excess WHERE id=@id --删除该临时话单
  end
else --未找到,则新建
  begin
  insert into corp_qd(lordname,lordAccount,Functype,lordnumb,benumb,starttime,endtime,Usetime,timelong,expenses,Remark) values (@lordname,@lordAccount,@Functype,@lordnumb,@benumb,@starttime,@endtime,@starttime,@timelong,@expenses,'OK-处理临时表')
  select @pay=pay from corp_zh where lordname=@lordname --查询余额
  update corp_zh set pay=(@pay-@expenses) where lordname=@lordname --更新余额
-- DELETE FROM corp_excess WHERE id=@id --删除该临时话单
  end
end
If @@error <> 0
  BEGIN
  SET @ErrorCNT=@ErrorCNT+1
  UPDATE corp_excess SET isOK=2 WHERE [id]=@id
  Rollback TRANSACTION

-- set @ReturnMsg=-1
-- return @ReturnMsg
  END
else
begin
  UPDATE corp_excess SET isOK=1 WHERE [id]=@id
  commit TRANSACTION
-- set @ReturnMsg=8
-- return @ReturnMsg
end
end --WHILE 1=1

if @ErrorCNT>0
begin
  set @ReturnMsg=-1
  return @ReturnMsg
end
else
begin
  set @ReturnMsg=1
  return @ReturnMsg
end
GO

------解决方案--------------------
HEHE,你的错很明显啊

看你这里的代码
begin TRANSACTIO