Sql server 2012 如何使用动态列名更新表?
下面的更新语句按预期工作。但是,我需要将语句循环50次以上。我正在尝试编写一个循环,允许我将设置的字段从Seg1更改为SegX,并将子字符串(GoalBusinessSegment,(6*1)-5,5)更新为“Seg”,将子字符串(GoalBusinessSegment,(6*X)-5,5)更新为“Seg” 下面是我对循环的尝试Sql server 2012 如何使用动态列名更新表?,sql-server-2012,Sql Server 2012,下面的更新语句按预期工作。但是,我需要将语句循环50次以上。我正在尝试编写一个循环,允许我将设置的字段从Seg1更改为SegX,并将子字符串(GoalBusinessSegment,(6*1)-5,5)更新为“Seg”,将子字符串(GoalBusinessSegment,(6*X)-5,5)更新为“Seg” 下面是我对循环的尝试 DECLARE @LoopCount int DECLARE @SegField varchar(255) DECLARE @i int DELETE FROM [d
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
DECLARE@LoopCount int
声明@SegField varchar(255)
声明@i int
从[dbo].[MULTBUSSEGTEST]中删除
插入[dbo]。[MULTBUSSEGTEST]
选择不同的GoalBusinessSegment作为“SegID”
,NULL为“Seg1”
,NULL为'Seg2'
,NULL为“Tgt1”
,NULL为'Tgt2'
,NULL为'Act1'
,NULL为'Act2'
自[2017].[dbo].[WPGDM]
其中GoalID介于22.1和22.4之间,左侧(GoalBusiness Segment,1)=“B”和LEN(GoalBusiness Segment)>5
设置@LoopCount=(选择楼层(最大(LEN(GoalBusinessSegment))/5)
自[2017].[dbo].[WPGDM]
)
而@i 5
)SegTBL
其中[dbo].[MULTBUSSEGTEST].SegID=SegTBL.GoalBusinessSegment
设置@i=@i+1
结束
循环生成所有空值,我缺少什么?意识到不需要多个字段和update语句。问题解决了
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