各位大虾,我用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 @Re='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,Re) 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=1if @ErrorCNT>0
begin
  set @ReturnMsg=-1
  return  @ReturnMsg
end
else
begin
  set @ReturnMsg=1
  return  @ReturnMsg
end
GO

解决方案 »

  1.   

    HEHE,你的错很明显啊看你这里的代码
    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 先定义了开始事务,然后赋值@id=-1
    中间查询不论,你的判断@id=-1是成立的,那么直接就退出了while循环
    而退出前,事务没有关闭,因此报错在判断那里做一下就成
    if @id=-1
    begin
       commit tran
       break 
    end
      

  2.   

    记录到http://www.zhuicha.com/bbs了