【这个错误怎么办?】EXECUTE 后的事务计数指示缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。上一计数 = 1,当前计数 = 2

vvlovevv 2013-03-12 11:24:13
我的写了sql存储过程,出现这个错误,是怎么回事?麻烦大神给可能下!本人先谢了!
这个是报错的那段代码,应该怎么改呢?

nextinsert:
--插入月结主表对应数据
insert into dbo.t_StockStorage
( c_ID ,
c_Type ,
c_JigouID ,
c_Month ,
c_StaffID ,
c_Ctime ,
c_Remark
)
VALUES ( @storid, -- c_ID - nvarchar(50)
'无毛绒' , -- c_Type - nvarchar(50)
@JigouID , -- c_JigouID - nvarchar(50)
@yjtime, -- c_Month - datetime
@staffid , -- c_StaffID - nvarchar(50)
@createtime , -- c_Ctime - datetime
@remark -- c_Remark - ntext
)
--获取插入到月结主表最新的主键id
select @storageId = scope_identity()

/*计算库存月结数据逻辑SQL语句,可以利用临时表或with cte的用法,下文以cte为主。*/

--向月结子表插入数据
--insert into StockStorageDetail
--select @storageId,productid,quantity
--from cte


IF EXISTS(SELECT 1 FROM dbo.t_StockStorage WHERE c_JigouID=@JigouID)
/*第一种情况:从未做过月结*/
BEGIN
SELECT * INTO #t_inv FROM dbo.t_CashmereInventory WHERE c_Pihao IN (SELECT c_Pihao FROM dbo.v_CashmereInBodyDetails WHERE c_time<=@yjtime AND c_jigouID=@JigouID AND IsAccount=1)
UPDATE #t_inv SET c_Inventory=0 --将数据归零准备重新计算
DECLARE yb_ph CURSOR FOR
SELECT c_Pihao,c_ChangduID,c_PositionID FROM #t_inv WHERE c_JiGouID=@JigouID;
SELECT @count = count(*) FROM #t_inv WHERE c_JiGouID=@jigouid;
OPEN yb_ph
WHILE @count >0 AND @@FETCH_STATUS=0

BEGIN
FETCH NEXT FROM yb_ph INTO @pihao,@changdu,@kuwei
/*先取入库数据进行运算*/
SELECT @rksj =c_Weight FROM dbo.v_CashmereInBodyDetails WHERE c_Pihao=@pihao AND LengthID=@changdu AND c_PositionID=@kuwei AND c_jigouID=@JigouID
UPDATE #t_inv SET c_Inventory=c_Inventory+@rksj WHERE c_Pihao=@pihao AND c_ChangduID=@changdu AND c_PositionID=@kuwei AND c_jigouID=@JigouID
/*再取出库数据进行运算*/
SELECT @cksj =c_Weight FROM dbo.v_CashmereOutDetails WHERE c_Pihao=@pihao AND LenthID=@changdu AND c_PositionID=@kuwei AND c_jigouID=@JigouID
UPDATE #t_inv SET c_Inventory=c_Inventory-@cksj WHERE c_Pihao=@pihao AND c_ChangduID=@changdu AND c_PositionID=@kuwei AND c_jigouID=@JigouID
/*将数据插入到月结明细表中*/
INSERT INTO dbo.t_StockStorageDetail
( c_StorageId ,
c_Pihao ,
c_Pinming ,
c_ChangduID ,
c_Inventory ,
c_Remark ,
c_PositionID ,
c_JiGouID ,
c_Bianma ,
c_Xidu ,
c_Hancu ,
c_Yise ,
c_PType ,
c_Chundu ,
c_Yizhi ,
c_Fupi ,
c_Duanrong
)
SELECT @storid,
c_Pihao ,
c_Pinming ,
c_ChangduID ,
c_Inventory ,
c_Remark ,
c_PositionID ,
c_JiGouID ,
c_Bianma ,
c_Xidu ,
c_Hancu ,
c_Yise ,
c_PType ,
c_Chundu ,
c_Yizhi ,
c_Fupi ,
c_Duanrong
FROM #t_inv
END

END
ELSE
/*已经有月结记录,本期库存=期初库存+入库-出库*/
SELECT * INTO #t_inv0 FROM dbo.t_CashmereInventory WHERE 1>1
--从月结表中先将上月期初数据复制过来
INSERT INTO #t_inv0
( c_Pihao ,
c_Pinming ,
c_ChangduID ,
c_Inventory ,
c_Remark ,
c_PositionID ,
c_JiGouID ,
c_Bianma ,
c_Xidu ,
c_Hancu ,
c_Yise ,
c_PType ,
c_Chundu ,
c_Yizhi ,
c_Fupi ,
c_Duanrong
)
SELECT
c_Pihao ,
c_Pinming ,
c_ChangduID ,
c_Inventory ,
c_Remark ,
c_PositionID ,
c_JiGouID ,
c_Bianma ,
c_Xidu ,
c_Hancu ,
c_Yise ,
c_PType ,
c_Chundu ,
c_Yizhi ,
c_Fupi ,
c_Duanrong
FROM dbo.t_StockStorageDetail WHERE c_StorageId IN(SELECT c_ID FROM dbo.t_StockStorage WHERE c_Month=DATEADD(MONTH,-1,@yjtime) AND c_JigouID=@JigouID)

/*从库存表中复制上月新增批号的数据*/
DECLARE @yjPrev DATETIME ---上一个月结时间
DECLARE @InvID VARCHAR(50) --保存库存ID
DECLARE @pihao_n VARCHAR(50) --保存游标批号
DECLARE @changdu_n VARCHAR(50) --保存游标长度
DECLARE @kuwei_n VARCHAR(50) --保存游标库位


SELECT @yjPrev=c_Month FROM dbo.t_StockStorage WHERE c_Month=DATEADD(MONTH,-1,@yjtime) AND c_JigouID=@JigouID

DECLARE yb_phmuti CURSOR FOR
SELECT c_Pihao,LengthID,c_PositionID FROM dbo.v_CashmereInBodyDetails WHERE c_jigouID=@jigouid AND c_time<=@yjtime AND c_time>=@yjPrev AND c_jigouID=@JigouID AND IsAccount=1 ;
SELECT @count = count(*) FROM #t_inv0 WHERE c_JiGouID=@JigouID AND c_time<=@yjtime AND c_time>=@yjPrev AND c_jigouID=@JigouID AND IsAccount=1;

OPEN yb_phmuti;
WHILE @count > 0 AND @@FETCH_STATUS=0
/*存储游标循环*/
BEGIN
FETCH NEXT FROM yb_phmuti INTO @pihao_n,@changdu_n,@kuwei_n;
IF NOT EXISTS(SELECT 1 FROM #t_inv0 WHERE c_Pihao=@pihao_n AND c_ChangduID=@changdu_n AND c_PositionID=@kuwei_n)
INSERT INTO #t_inv0
( c_Pihao ,
c_Pinming ,
c_ChangduID ,
c_Inventory ,
c_Remark ,
c_PositionID ,
c_JiGouID ,
c_Bianma ,
c_Xidu ,
c_Hancu ,
c_Yise ,
c_PType ,
c_Chundu ,
c_Yizhi ,
c_Fupi ,
c_Duanrong
)
SELECT
c_Pihao ,
c_Pinming ,
c_ChangduID ,
0 , --默认为0
c_Remark ,
c_PositionID ,
c_JiGouID ,
c_Bianma ,
c_Xidu ,
c_Hancu ,
c_Yise ,
c_PType ,
c_Chundu ,
c_Yizhi ,
c_Fupi ,
c_Duanrong
FROM dbo.t_CashmereInventory WHERE c_Pihao=@pihao_n AND c_PositionID=@kuwei_n AND c_ChangduID=@changdu_n AND c_JiGouID=@JigouID
END
/*循环结束*/
/*开始计算*/
DECLARE yb_phjs CURSOR FOR
SELECT c_Pihao,c_ChangduID,c_PositionID FROM #t_inv0;
SELECT @count = count(*) FROM #t_inv0;
OPEN yb_phjs
WHILE @count >0 AND @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM yb_phjs INTO @pihao,@changdu,@kuwei;
--计算入库数据
SELECT @rksj =c_Weight FROM dbo.v_CashmereInBodyDetails WHERE c_Pihao=@pihao AND LengthID=@changdu AND c_PositionID=@kuwei AND c_jigouID=@JigouID
UPDATE #t_inv0 SET c_Inventory=c_Inventory+@rksj WHERE c_Pihao=@pihao AND c_ChangduID=@changdu AND c_PositionID=@kuwei AND c_jigouID=@JigouID
--计算出库数据
SELECT @cksj =c_Weight FROM dbo.v_CashmereOutDetails WHERE c_Pihao=@pihao AND LenthID=@changdu AND c_PositionID=@kuwei AND c_jigouID=@JigouID
UPDATE #t_inv0 SET c_Inventory=c_Inventory-@cksj WHERE c_Pihao=@pihao AND c_ChangduID=@changdu AND c_PositionID=@kuwei AND c_jigouID=@JigouID
/*将数据插入到月结明细表中*/
INSERT INTO dbo.t_StockStorageDetail
( c_StorageId ,
c_Pihao ,
c_Pinming ,
c_ChangduID ,
c_Inventory ,
c_Remark ,
c_PositionID ,
c_JiGouID ,
c_Bianma ,
c_Xidu ,
c_Hancu ,
c_Yise ,
c_PType ,
c_Chundu ,
c_Yizhi ,
c_Fupi ,
c_Duanrong
)
SELECT @storid,
c_Pihao ,
c_Pinming ,
c_ChangduID ,
c_Inventory ,
c_Remark ,
c_PositionID ,
c_JiGouID ,
c_Bianma ,
c_Xidu ,
c_Hancu ,
c_Yise ,
c_PType ,
c_Chundu ,
c_Yizhi ,
c_Fupi ,
c_Duanrong
FROM #t_inv0
end
if(@@error<>0) goto Failure
commit transaction
set @text = @warehousename+replace(convert(varchar(7),@yjtime,120),'-','年')+'月月结数据插入已完成!'
return

...全文
241 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr_Nice 2013-03-13
  • 打赏
  • 举报
回复
最简单的解决办法,在最后检测@@TRANCOUNT 是不是0,如果不是,就做相应的提交或者是撤回处理即可。 错误的原因,一般有两种: 1.可能在事务中间出现return语句导致存储过程跳出,没有继续往下执行.. 2.可能在事务开始到结束这中间出现sql语句的错误,或者其他。比如写错表名,写错sql语句等。 看lz代码应该是return造成的。 建议return在begin end 间。
vvlovevv 2013-03-13
  • 打赏
  • 举报
回复
引用 3 楼 Haiwer 的回复:
写法太复杂了,要看懂太费时间(而且你没有贴全) 如果2005+建议用try catch结构控制出错 游标尽量用语句代替 事务处理要清晰,不要到处放提交和回滚语句 以上是没看懂情况下的总体建议,这么长很难有时间看完的
你好,在if后再加else begin end 就出现上面的错误,是我语法错误吗?您给看下!这回我只贴出部分

IF NOT EXISTS(SELECT 1 FROM dbo.t_StockStorage WHERE c_JigouID=@JigouID AND c_ID<>@storageId)
 /*第一种情况:从未做过月结*/
BEGIN	
	SELECT * INTO #t_inv FROM dbo.t_CashmereInventory WHERE c_Pihao IN (SELECT c_Pihao FROM dbo.v_CashmereInBodyDetails WHERE c_time<=@yjtime AND c_jigouID=@JigouID AND IsAccount=1)
	UPDATE #t_inv SET c_Inventory=0  --将数据归零准备重新计算
	DECLARE yb_ph CURSOR FOR 
		SELECT c_Pihao,c_ChangduID,c_PositionID FROM  #t_inv WHERE c_JiGouID=@JigouID;
	SELECT @count = count(*) FROM  #t_inv WHERE c_JiGouID=@jigouid;
	OPEN yb_ph
	WHILE @count >0 AND @@FETCH_STATUS=0
  
	   BEGIN
		   FETCH NEXT FROM yb_ph INTO @pihao,@changdu,@kuwei
			/*先取入库数据进行运算*/
           SELECT @rksj =c_Weight FROM dbo.v_CashmereInBodyDetails WHERE c_Pihao=@pihao 
       END
    CLOSE yb_ph
    DEALLOCATE yb_ph
        INSERT INTO dbo.t_StockStorageDetail
        ( c_StorageId ,
          c_Pihao ,
          c_Pinming ,
          c_ChangduID ,
          c_Inventory ,
          c_Remark ,
          c_PositionID ,
          c_JiGouID ,
          c_Bianma ,
          c_Xidu ,
          c_Hancu ,
          c_Yise ,
          c_PType ,
          c_Chundu ,
          c_Yizhi ,
          c_Fupi ,
          c_Duanrong
        )
   SELECT @storid,
          c_Pihao ,
          c_Pinming ,
          c_ChangduID ,
          c_Inventory ,
          c_Remark ,
          c_PositionID ,
          c_JiGouID ,
          c_Bianma ,
          c_Xidu ,
          c_Hancu ,
          c_Yise ,
          c_PType ,
          c_Chundu ,
          c_Yizhi ,
          c_Fupi ,
          c_Duanrong
          FROM #t_inv
  END
  
  
/*在此加上
else
begin 
   游标
   begin 
   xxxxx
   end
end 

后就出现上面的错误了,麻烦给看下,是我写的语法不对吗?*/




--将出入库表标记为已月结,月结后单据无法进行反审核
UPDATE xxxxxx
if(@@error<>0) goto Failure  
commit transaction  
set @text = @warehousename+replace(convert(varchar(7),@yjtime,120),'-','年')+'月月结数据插入已完成!'  
return   
szm341 2013-03-12
  • 打赏
  • 举报
回复
你自己检查一下,一个begin tran会增加一个事务计数器,要有相同数量的commit与之对应,而rollback可以回滚全部计数器,你的错误提示是有两个begin tran而你只写了一个commit
昵称被占用了 2013-03-12
  • 打赏
  • 举报
回复
写法太复杂了,要看懂太费时间(而且你没有贴全) 如果2005+建议用try catch结构控制出错 游标尽量用语句代替 事务处理要清晰,不要到处放提交和回滚语句 以上是没看懂情况下的总体建议,这么长很难有时间看完的
vvlovevv 2013-03-12
  • 打赏
  • 举报
回复
引用 1 楼 Haiwer 的回复:
commit transaction 没有对应的 begin transaction
请问下怎么修改?谢谢!初学者!
昵称被占用了 2013-03-12
  • 打赏
  • 举报
回复
commit transaction 没有对应的 begin transaction

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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