2017-07-16 53 views
0

以下更新声明按预期工作。但是,我需要循环50次以上的声明。我正在尝试编写一个循环,使我可以将从Seg1设置为SegX的字段以及将SubString(GoalBusinessSegment,(6 * 1)-5,5)AS'Seg'更新为SubString(GoalBusinessSegment ,(6 * X)-5,5)AS'Seg'如何使用动态列名更新表?

UPDATE [dbo].[MULTBUSSEGTEST] 
SET Seg1 = SegTBL.Seg 
FROM (SELECT DISTINCT GoalBusinessSegment,SubString(GoalBusinessSegment,(6*1)-5,5) AS 'Seg' 
     FROM [2017].[dbo].[WPGDM] 
     WHERE GoalID BETWEEN 22.1 AND 22.4 AND 
      LEFT(GoalBusinessSegment,1) = 'B' AND LEN(GoalBusinessSegment) > 5 
    ) SegTBL 
WHERE [dbo].[MULTBUSSEGTEST].SegID = SegTBL.GoalBusinessSegment 

以下是我在循环中的尝试。

DECLARE @LoopCount int 
DECLARE @SegField varchar(255) 
DECLARE @i int 

DELETE FROM [dbo].[MULTBUSSEGTEST] 

INSERT INTO  [dbo].[MULTBUSSEGTEST] 
SELECT DISTINCT GoalBusinessSegment AS 'SegID' 
      ,NULL AS 'Seg1' 
      ,NULL AS 'Seg2' 
      ,NULL AS 'Tgt1' 
      ,NULL AS 'Tgt2' 
      ,NULL AS 'Act1' 
      ,NULL AS 'Act2' 
FROM  [2017].[dbo].[WPGDM] 
WHERE  GoalID BETWEEN 22.1 AND 22.4 AND LEFT(GoalBusinessSegment,1) = 'B' AND LEN(GoalBusinessSegment) > 5 

Set @LoopCount = (SELECT FLOOR(MAX(LEN(GoalBusinessSegment))/5) 
        FROM [2017].[dbo].[WPGDM] 
       ) 
WHILE @i <= @LoopCount 
BEGIN 
Set @SegField = 'Seg' + @LoopCount 
UPDATE [dbo].[MULTBUSSEGTEST] 
    SET @SegField = SegTBL.Seg 
    FROM (SELECT DISTINCT GoalBusinessSegment 
      ,SubString(GoalBusinessSegment,(6*@i)-5,5) AS 'Seg' 
      FROM [2017].[dbo].[WPGDM] 
      WHERE GoalID BETWEEN 22.1 AND 22.4 AND LEFT(GoalBusinessSegment,1) = 'B' AND LEN(GoalBusinessSegment) > 5 
     ) SegTBL 
WHERE [dbo].[MULTBUSSEGTEST].SegID = SegTBL.GoalBusinessSegment 
SET @i = @i + 1 
END 

该循环产生所有空值,我失去了什么?

回答

0

认识到多个字段和更新语句不是必需的。问题解决了。