2017-07-16 7 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 

ループはすべてnull値を生成しますが、何が欠けていますか?

答えて

0

複数のフィールドと更新ステートメントが不要であることを実現しました。問題が解決しました。

関連する問題