1、计数是如何产生的。
--
计算是SQLSERVER自己产生的2、产生的计数在什么情况下可以清为0
-- 
  rollback 不管当前的计算器是多少,直接清0
  commit   把当前的计算器减13、如何避免这种错误。
--
显式的控制事务,

解决方案 »

  1.   

    1、计数是如何产生的。
    --
    计算是SQLSERVER自己产生的,一个显式或的隐式的begin trans 计数器就会加 1
      

  2.   

    我这个出错的提示是如何产生的呢?为什么说是缺少了COMMIT或ROLLBACK TRANSACTION
      

  3.   

    要是不出错的情况下,begin trans 与commit trans 成对出现就行
    一旦有有错出现 时,你的SQL语句就要小心了,因为你一rollback 会造成 计数 不匹配
    SELECT '事务处理前', @@TRANCOUNT      --值为 0BEGIN TRAN  SELECT '第一个事务', @@TRANCOUNT      --值为 1    SELECT * FROM table1    BEGIN TRAN        SELECT '第二个事务', @@TRANCOUNT  --值为 2         DELETE table1    COMMIT TRAN    SELECT '递交第二个事务', @@TRANCOUNT --值为 1ROLLBACK TRANSELECT '回滚第一个事务', @@TRANCOUNT --值为 0
      

  4.   

    在你的事务里面显示的调用 commit 和错误处理 rollback
      

  5.   

    或是把你的SQL语句贴上来看看
      

  6.   

    代码如下,看是否问题  CREATE PROCEDURE XT_ZDSF 
      @LS_ZLH  varchar(3) ,    
      @LS_SYH  varchar(20) ,   
      @LS_GCZH varchar(20) ,   
      @LS_YSDJ  varchar(12) ,  
      @LS_YHXS  varchar(7), 
      @LS_SFMS  tinyint, 
      @LS_FPH   VARCHAR(10)='', 
      @LS_SFRY   VARCHAR(10)='', 
      @LS_SFRQ   VARCHAR(10)=''  
      AS    
      -------------------------------------启动事务 
      BEGIN TRAN    
      DECLARE @LS_STR VARCHAR(2000)    
      DECLARE @LS_XGQZH VARCHAR(20)    
      DECLARE @LS_XGQDJ VARCHAR(10)    
      DECLARE @LS_YHDJ  varchar(12)  
      DECLARE @LS_SF VARCHAR(10)    
      DECLARE @LS_SFZL VARCHAR(4)    
      DECLARE @LS_SFBH VARCHAR(20)    
      DECLARE @LS_ZHLB VARCHAR(20)    
      DECLARE @LS_DJRQ VARCHAR(10)    
      DECLARE @LS_DJRY VARCHAR(10)    
      DECLARE @err int   
      SET @ERR=0  
     PRINT @LS_YHXS+'A' 
     -----------------------计算优惠价格 
     IF CONVERT(numeric(7,4),@LS_YHXS)>0 
        SET @LS_YHDJ=CONVERT(VARCHAR(12),CONVERT(numeric(12,2),@LS_YSDJ)*CONVERT(numeric(7,4),@LS_YHXS)) 
     ELSE 
        SET @LS_YHDJ=@LS_YSDJ 
     -----------------------检查当前收费情况  
      SELECT TOP 1 @LS_SF=SF,@LS_XGQDJ=YHDJ,@LS_XGQZH=GCZH,@LS_SFZL=SFZL,@LS_SFBH=FPH,@LS_DJRY=DJRY,@LS_DJRQ=DJRQ  
      FROM SYTZ  WHERE LTRIM(RTRIM(ZLH))=@LS_ZLH AND SYH=@LS_SYH    
      select  @LS_SF,@LS_XGQDJ,@LS_XGQZH,@LS_SFZL  
      IF @LS_SFRY='' 
         SET @LS_SFRY=@LS_DJRY    
      IF @LS_SFRQ='' 
         SET @LS_SFRQ=@LS_DJRQ 
      --是否是在启用收费日期之后    
      IF exists(SELECT SFQYSJ FROM [NMB004JCZK].[DBO].[SYBHK] WHERE ZLH='A1' AND CONVERT(DATETIME,REPLACE(@LS_DJRQ,'.',''))<CONVERT(DATETIME,REPLACE(SFQYSJ,'.','')))   
      BEGIN    
       RETURN    
      END    
      ----判断是否为自动收费  
      IF exists (SELECT SFZDSM  FROM [NMB004JCZK].[DBO].SYBHK WHERE  LTRIM(RTRIM(ZLH))=@LS_ZLH AND CHARINDEX('自动',SFZDSM)>0) OR (@LS_SFMS=2 AND @LS_SF<>'已收')  
      BEGIN  
      IF @LS_SF<>'已收'  
       BEGIN    
       --第一次委托    
       IF  LEN(LTRIM(RTRIM(@LS_GCZH)))>0 --有帐号时工程帐号     
            EXEC LR1_PRG  @LS_GCZH,@LS_YHDJ,@LS_YSDJ,@LS_YHXS,@LS_ZLH,@LS_SYH,@LS_SFRY,@LS_SFRQ,@LS_FPH                       
          ELSE  ------------无帐号或无效     
            EXEC UPDATE_SFZK @LS_ZLH,@LS_SYH,'','未收','',@LS_YHDJ,@LS_YSDJ,@LS_YHXS,'',''  
       END    
      ELSE --修改时    
        IF LEN(LTRIM(RTRIM( @LS_SFBH)))=0 AND CHARINDEX('现金',@LS_SFZL)=0 AND CHARINDEX('特批',@LS_SFZL)=0/*排除人工收费修改 */    
        IF LEN(LTRIM(RTRIM(@LS_XGQZH)))>0   /*--修改前为工程帐号时  */    
                  IF LEN(LTRIM(RTRIM(@LS_GCZH)))>0  --修改后为工程帐号时          
                       EXEC XG11_PRG   @LS_GCZH,@LS_YHDJ,@LS_YSDJ,@LS_YHXS,@LS_XGQZH,@LS_XGQDJ,@LS_SF,@LS_SFZL,@LS_ZLH,@LS_SYH,@LS_SFRY,@LS_SFRQ    
                  ELSE --修改后为无帐号时          
                       EXEC XG12_PRG   @LS_GCZH,@LS_YHDJ,@LS_YSDJ,@LS_YHXS,@LS_XGQZH,@LS_XGQDJ,@LS_SF,@LS_SFZL,@LS_ZLH,@LS_SYH,@LS_SFRY,@LS_SFRQ    
        ELSE              /*--修改前无帐号或为空时*/    
                  IF LEN(LTRIM(RTRIM(@LS_GCZH)))>0  --修改后工程帐号时          
                       EXEC XG31_PRG   @LS_GCZH,@LS_YHDJ,@LS_YSDJ,@LS_YHXS,@LS_XGQZH,@LS_XGQDJ,@LS_SF,@LS_SFZL,@LS_ZLH,@LS_SYH,@LS_SFRY,@LS_SFRQ    
                  ELSE    --修改后为无帐号    
                       EXEC XG32_PRG   @LS_GCZH,@LS_YHDJ,@LS_YSDJ,@LS_YHXS,@LS_XGQZH,@LS_XGQDJ,@LS_SF,@LS_SFZL,@LS_ZLH,@LS_SYH,@LS_SFRY,@LS_SFRQ    
         IF  @@ERROR <> 0   
             SET @ERR=@ERR+1  
      END  
      ELSE  ----人工收费模式  
       BEGIN  
       ----写台帐表  
       UPDATE SYTZ SET GCZH=@LS_GCZH,YSDJ=@LS_YSDJ,YHDJ=@LS_YHDJ WHERE LTRIM(RTRIM(ZLH))=@LS_ZLH AND SYH=@LS_SYH  
       END  
      IF @ERR>0  
      BEGIN  
      ROLLBACK TRAN  
      END  
      COMMIT TRAN 
    GO