使用映射表

时间:2016-01-11 12:30:14

标签: sql-server tsql sql-server-2012

我正在尝试将值从一列复制到同一个表中的另一列,并努力找出正确的方法来执行此操作。 理想情况下,我会在代码而不是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)在存储过程中运行一个函数,该函数以SourceIDQuestionnaireID为参数并搜索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

1 个答案:

答案 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