我正在尝试将值从一列复制到同一个表中的另一列,并努力找出正确的方法来执行此操作。 理想情况下,我会在代码而不是SQL中执行此操作,但是我正在处理遗留应用程序,因此更新代码(虽然新版本已经在开发中)是禁止的。
我有下表(IncomingData
)
id PK
SourceID int
QuestionnaireID int
Q1 varchar(500)
Q2 varchar(500)
..
..
Q50 varchar(500)
所以我们会:
id SourceID QuestionnaireID Q1 Q2 Q3 Q4 Q5
1 5000 10 1 2 1 5 3
数据偶尔会从特定的SourceID
进入(通过网络服务),其中Q1(等)需要转移到Q3,以便我们的系统正确处理它。
所以为此我创建了以下映射表
id SourceID QuestionnaireID SourceQ DestQ
1 5000 10 Q1 Q3
1 5000 10 Q2 Q4
1 5000 10 Q3 Q5
1 5000 10 Q4 Q7
1 5000 10 Q5 Q8
我的想法是创建一个匹配IncomingData
的临时表,将值复制到此临时表中的正确列,然后使用正确列中的值更新该行的IncomingData
。
有没有一种简单的方法可以做到这一点?我唯一能看到的就是在这个函数中创建大量的动态SQL语句并执行它们。由于注入,这引起了我的注意,但是插入临时表的sql只能从映射表中创建,因此外部变量不会传递给动态SQL,所以这是一个问题吗?
更新
(我的预期)数据流:
1)数据显示在IncomingData
2)计划运行存储过程以从incomingdata
3)在存储过程中运行一个函数,该函数以SourceID
和QuestionnaireID
为参数并搜索SourceDestXmap
表
4)如果有匹配(即某些列需要更改),那么,对于SourceDestXmap
中的每一行,SourceQ
的值需要插入临时的DestQ
表
所以从上面的例子中,需要将IncomingData.Q5的值插入到tempData.Q8列中,其中映射是从SourceDestXmap
注意事项: 可以有任何数量的映射,例如,QuestionnaireID11可以具有Q8-> Q27映射以及Q16-> Q4映射。
更新#2
我基本上需要一种更有活力的方法来做这样的事情:
BEGIN
DECLARE @tmpQ3 varchar(2000)
DECLARE @tmpQ4 varchar(2000)
DECLARE @tmpQ5 varchar(2000)
DECLARE @tmpQ7 varchar(2000)
DECLARE @tmpQ8 varchar(2000)
SET @tmpQ3 = @prmQ1
SET @tmpQ4 = @prmQ2
SET @tmpQ5 = @prmQ3
SET @tmpQ7 = @prmQ4
SET @tmpQ8 = @prmQ5
SET @prmQ1 = NULL
SET @prmQ2 = NULL
SET @prmQ3 = NULL
SET @prmQ4 = NULL
SET @prmQ5 = NULL
SET @prmQ3 = @tmpQ3
SET @prmQ4 = @tmpQ4
SET @prmQ5 = @tmpQ5
SET @prmQ7 = @tmpQ7
SET @prmQ8 = @tmpQ8
END
答案 0 :(得分:1)
当然这不完全是你所需要的(我完全不理解它),但你可能会有一个想法,你怎么能和#34;转移"抛开你的价值并在一个步骤中设置新值(更新):
DECLARE @IncomingData TABLE(ID INT,SourceID INT,QuestionairID INT,Q1 VARCHAR(10),Q2 VARCHAR(10),Q3 VARCHAR(10),Q4 VARCHAR(10),Q5 VARCHAR(10));
INSERT INTO @IncomingData VALUES (1,5000,10,'1','2','3','4','5');
DECLARE @NewData TABLE(ID INT,SourceID INT,QuestionairID INT,Q1 VARCHAR(10),Q2 VARCHAR(10),Q3 VARCHAR(10),Q4 VARCHAR(10),Q5 VARCHAR(10));
INSERT INTO @NewData VALUES (1,5000,10,'new1','new2','new3','new4','new5');
--This will shift all original data "two steps aside"...
UPDATE @IncomingData SET id.Q5=id.Q3,id.Q4=id.Q2,id.Q3=id.Q1
,id.Q2=new.Q2
,id.Q1=new.Q1
FROM @IncomingData AS id
CROSS JOIN @NewData AS new
SELECT * FROM @IncomingData
结果:
ID SourceID QuestionairID Q1 Q2 Q3 Q4 Q5
1 5000 10 new1 new2 1 2 3