2013-06-27 27 views
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 

我想更新gl_acct_no_01到05使用存储过程中的循环..请帮助感谢。

+0

有什么不对您当前密码的长度?你真的需要选择退出动态SQL来替换5个更新语句吗?顺便说一句,结果代码的长度将接近你当前5次更新的长度。 – peterm

+1

我只想要一个较短的代码,顺便说一句,谢谢..最近我已经得到了我的问题的答案.. :) –

回答

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 
+0

现在它不是更短,是吗? – peterm

+1

感谢您的回答,但我需要循环....我有一个答案,我会后发表:D –

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 '[email protected]_cn+ ' = ' + CONVERT(VARCHAR,@OLDAcctNo) 
      EXEC Sp_executesql @sql 
      END 
     FETCH next FROM cn_list INTO @curr_cn 
     END 
    CLOSE cn_list 
    DEALLOCATE cn_list;