【问题标题】:How to update multiple columns using loop in stored procedure?如何在存储过程中使用循环更新多个列?
【发布时间】:2013-06-24 11:51:12
【问题描述】:

有人可以帮我解决这个问题吗,我在一张表上有 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。请帮助谢谢。

【问题讨论】:

  • 您当前代码的长度有什么问题?你真的需要选择退出动态 SQL 来替换 5 个更新语句吗?顺便说一句,结果代码的长度将接近您当前 5 次更新的长度。
  • 我只是想要一个更短的代码,顺便说一句谢谢.. 最近我的问题得到了答案.. :)

标签: sql stored-procedures while-loop


【解决方案1】:

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

   --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;    

【讨论】:

    【解决方案2】:
     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
    

    【讨论】:

    • 现在不短了吧?
    • 感谢您的回答,但我需要循环......我有答案我会稍后发布:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多