有人可以帮我解决这个问题吗,我在一个表上有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 ..请帮助谢谢。
答案 0 :(得分: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
答案 1 :(得分: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;