1

有人可以帮我解决这个问题吗,我在一张表上有 5 列(表:gl_acct_no),在 SQL 上使用存储过程我想使用循环来缩短我的代码,这是我的代码:

        CREATE PROCEDURE [dbo].[sp_UpdateAccountNo]                    
    (                    
     @flag int                    
     ,@NEWAcctNo  nAcct_num_10                    
     ,@OLDAcctNo  nAcct_num_10                    
    )                    
    AS                    

     IF EXISTS(SELECT glmt_udAcct_no_old FROM gl_master WHERE glmt_udAcct_no = @NEWAcctNo)                    
      BEGIN                    
       return(1)                  
      END                    
     ELSE                    
      BEGIN                    
       if @flag = 0                
        BEGIN                    
         UPDATE gl_master                     
         SET glmt_udAcct_no_old = @OLDAcctNo                     
         WHERE glmt_udAcct_no = @OLDAcctNo                        
        END                     
       UPDATE gl_master                     
       SET glmt_udAcct_no = @NEWAcctNo                     
       WHERE glmt_udAcct_no_old = @OLDAcctNo

   UPDATE gl_acct_no         
   SET gl_acno_01 = @NEWAcctNo               
   WHERE gl_acno_01 = @OLDAcctNo       

   UPDATE gl_acct_no         
   SET gl_acno_02 = @NEWAcctNo               
   WHERE gl_acno_02 = @OLDAcctNo       

   UPDATE gl_acct_no         
   SET gl_acno_03 = @NEWAcctNo               
   WHERE gl_acno_03 = @OLDAcctNo       

   UPDATE gl_acct_no         
   SET gl_acno_04 = @NEWAcctNo               
   WHERE gl_acno_04 = @OLDAcctNo       

   UPDATE gl_acct_no         
   SET gl_acno_05 = @NEWAcctNo               
   WHERE gl_acno_05 = @OLDAcctNo

END

我想在存储过程中使用循环将 UPDATE gl_acct_no_01 更新为 05。请帮助谢谢。

4

2 回答 2

1
 CREATE PROCEDURE [dbo].[sp_UpdateAccountNo]                    
    (                    
     @flag int                    
     ,@NEWAcctNo  nAcct_num_10                    
     ,@OLDAcctNo  nAcct_num_10                    
    )                    
    AS    
   begin   
   UPDATE gl_acct_no         
   SET 
    glmt_udAcct_no_old=(case when  (@flag = 0 and glmt_udAcct_no = @OLDAcctNo) then @NEWAcctNo else glmt_udAcct_no_old end),
    glmt_udAcct_no=(case when glmt_udAcct_no = @OLDAcctNo then @NEWAcctNo else glmt_udAcct_no end),
    gl_acno_01=(case when gl_acno_01 = @OLDAcctNo then @NEWAcctNo else gl_acno_01 end),
    gl_acno_02=(case when gl_acno_02 = @OLDAcctNo then @NEWAcctNo else gl_acno_02 end),
    gl_acno_03=(case when gl_acno_03 = @OLDAcctNo then @NEWAcctNo else gl_acno_03 end),
    gl_acno_04=(case when gl_acno_04 = @OLDAcctNo then @NEWAcctNo else gl_acno_04 end),
    gl_acno_05=(case when gl_acno_05 = @OLDAcctNo then @NEWAcctNo else gl_acno_05 end)
    where glmt_udAcct_no = @NEWAcctNo 

END
于 2013-06-27T06:03:20.590 回答
0

我找到了答案感谢那些试图回答我的问题的人:)

   --UPDATE LOOP FOR gl_acct_no--
   DECLARE @sql NVARCHAR(1000),
   @curr_cn NVARCHAR(1000)
   DECLARE cn_list CURSOR FOR
   SELECT column_name FROM information_schema.columns
   WHERE table_name = 'gl_acct_no'ORDER BY ordinal_position
   OPEN cn_list FETCH next FROM cn_list INTO @curr_cn
   WHILE @@FETCH_STATUS = 0
        BEGIN
        print @curr_cn
            BEGIN
            SET @sql = 'UPDATE gl_acct_no set ' + @curr_cn + ' = '+ CONVERT(VARCHAR,@NEWAcctNo)+' where '+@curr_cn+ ' = ' + CONVERT(VARCHAR,@OLDAcctNo)
            EXEC Sp_executesql @sql
            END
        FETCH next FROM cn_list INTO @curr_cn
        END
   CLOSE cn_list
   DEALLOCATE cn_list;    
于 2013-06-28T05:35:25.370 回答