sql中的事务控制语言

时间:2014-09-25 15:21:31

标签: sql sql-server

我有一个程序,我需要实现tcl以避免表中不需要的更新。 如果条件匹配,我试图返回值1否则如果条件不匹配我将返回0但是即使条件满足也无法返回1

程序

 begin
    if(value1= value2)

    begin transaction
    ------
    ------
    ------
    Commit Transaction
    Return
    set @result=1
    select @result
    End

    Else
    begin
    set @result=0
    select @result
    end
    End
  

此过程仅返回@ result = 0。

更新

Create procedure [dbo].[oc_AofA_Update_WO7965&WO7951_test] 
     @aoa_DateStamped smalldatetime = null,                                                              
     @aoa_DateSent smalldatetime = null,                                                              
     @aoa_Scanned bit = null,
     @accval_LastUpdatetime varchar(100) = null,
     @accval_LastUpdateError int output               
as  
set nocount on  
    declare @Retrivedate varchar(100)
    declare @NewRetrivedate varchar(100)                                                              
BEGIN
If(@accval_LastUpdatetime=@NewRetrivedate)
Begin                                                 

BEGIN TRANSACTION                                                              
 CREATE TABLE #tmp(remarks  ntext)                                                              
 INSERT INTO #tmp(remarks) SELECT  aoa_Remarks   FROM TBL_APPOINTMENTOFAGENT WHERE aoa_AccountID = @aoa_AccountID                                                              

             DECLARE @maxlength_oldval  int                            
             DECLARE @maxlength_newval  int                               
 SET @maxlength_oldval = (SELECT DATALENGTH(remarks) FROM #tmp)
   if cast(@aoa_DateStamped as varchar) = '' 
   BEGIN
        IF @@ERROR !=0                                                              
                BEGIN                                                              
                 ROLLBACK TRANSACTION                                                              
                 RETURN                                                       
                END                                                                  

               set @accval_LastUpdateError=1
               select @accval_LastUpdateError as accval_LastUpdateError1                                                             
   END  

   ELSE 
      UPDATE TBL_CLIENTS                                                                
              SET                          
              client_AuthorizationCode=@accval_LastUpdateError          
             WHERE client_ClientID=@aoa_Scanned                
                IF @@ERROR !=0                                        
                BEGIN                                                    
                 ROLLBACK TRANSACTION                                                              
                 RETURN      
                END
                COMMIT TRANSACTION                                                             
                    RETURN                                                            

    END 
                set @accval_LastUpdateError=1
                select @accval_LastUpdateError as accval_LastUpdateError1                                                         
End  



END

2 个答案:

答案 0 :(得分:1)

在商店流程中的各个位置,您都有一行RETURN。这导致程序立即返回主叫方。换句话说,它不会继续,也永远不会将@accval_LastUpdateError变量设置为任何内容。

程序非常混乱,下面的代码很可能就是您要找的。

但我会首先提出一些非常快速的建议:

  1. 保持一致的风格。例如,您有BeginBEGIN。试着坚持其中一个。
  2. 与缩进保持一致。例如,在BEGIN之后(不是BEGIN TRAN而不是控制流语句)缩进一次。
  3. 您不需要使用OUTPUT参数,可以使用过程返回值(即RETURN 1

  4. CREATE PROCEDURE [dbo].[oc_AofA_Update_WO7965&WO7951_test] 
         @aoa_DateStamped SMALLDATETIME = null,                                                              
         @aoa_DateSent SMALLDATETIME = null,                                                              
         @aoa_Scanned BIT = null,
         @accval_LastUpdatetime VARCHAR(100) = null,
         @accval_LastUpdateError INT OUTPUT               
    AS  
    
    SET NOCOUNT ON  
    DECLARE @Retrivedate VARCHAR(100)
    DECLARE @NewRetrivedate VARCHAR(100)                                                              
    
    BEGIN
        IF(@accval_LastUpdatetime=@NewRetrivedate)
        BEGIN                                                 
    
        BEGIN TRANSACTION                                                              
        IF CAST(@aoa_DateStamped AS VARCHAR) = '' 
        BEGIN
            IF @@ERROR !=0                                                              
            BEGIN                                                              
                ROLLBACK TRANSACTION                                                              
                --RETURN                                                       
            END                                                                  
    
            SET @accval_LastUpdateError=1
            SELECT @accval_LastUpdateError AS accval_LastUpdateError1  
    
        END
        ELSE
        IF @@ERROR !=0                                        
        BEGIN                                                    
            ROLLBACK TRANSACTION                                                              
            --RETURN      
        END
    
        COMMIT TRANSACTION                                                             
        --RETURN                                                            
    
        END 
    
        SET @accval_LastUpdateError=1
        SELECT @accval_LastUpdateError AS accval_LastUpdateError1                                                         
    
    END  
    

答案 1 :(得分:0)

您需要在第一个代码块周围放置BEGIN..END,启动事务不会隐式执行此操作。

 begin
    if(value1= value2)
    BEGIN
    begin transaction
    ------
    ------
    ------
    Commit Transaction
    Return
    set @result=1
    select @result
    End transaction
    END
    Else
    begin
    set @result=0
    select @result
    end
  End