各位大虾,我用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 [email protected] and [email protected] and [email protected] and endtime>[email protected]
if @FeeTmp<>-99999 --找到已经存储的话单清单,且结束时间比上报的错误话单还晚则直接返回
-- DELETE FROM corp_excess WHERE [email protected] --删除该临时话单
UPDATE corp_excess SET isOK=2 WHERE [id][email protected]
else
begin
Set @FeeTmp=-99999
select @FeeTmp=expenses,@endtimeTmp=endtime from corp_qd where [email protected] and [email protected] and [email protected] and endtime<[email protected]
if @FeeTmp<>-99999 --找到已经存储的话单清单但是结束时间小于上报的错误话单结束时间则以上报的为准,进行更新
begin
update corp_qd set [email protected],[email protected],[email protected],[email protected] where [email protected] and [email protected] and [email protected]
select @pay=pay from corp_zh where [email protected] --查询余额
update corp_zh set pay=(@pay-(@[email protected])) where [email protected] --更新余额
-- DELETE FROM corp_excess WHERE [email protected] --删除该临时话单
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 [email protected] --查询余额
update corp_zh set pay=(@[email protected]) where [email protected] --更新余额
-- DELETE FROM corp_excess WHERE [email protected] --删除该临时话单
end
end
If @@error <> 0
BEGIN
SET @[email protected]+1
UPDATE corp_excess SET isOK=2 WHERE [id][email protected]
Rollback TRANSACTION
-- set @ReturnMsg=-1
-- return @ReturnMsg
END
else
begin
UPDATE corp_excess SET isOK=1 WHERE [id][email protected]
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 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