2012-06-30 43 views
1

我有一个“表A”结构如下:TSQL - 动态SQL中的动态列名称?

Act_Code ACT_TYPE_1 ACT_TYPE_2 ACT_TYPE_3 ACT_TYPE_4 
-------- -------- ----------- ---------- ----------- 
ACT1  A   NULL  NULL   NULL 
ACT2  NULL   B   NULL   NULL 
ACT3  NULL   NULL  C   NULL 
ACT4  NULL   NULL  NULL   D 
ACT1  A   NULL  NULL   NULL 

正如你所看到的,ACT_TYPE数据将始终存入其中提到“Act_Code”字段的最后一个数字字段名称: EG 。 当Act_Code = “ACT1”,该Act_Type存储在字段 “ACT_TYPE_1” 当Act_Code = “ACT2”,该Act_Type存储在字段 “ACT_TYPE_2” 等等...

现在,我想从上面的“表A”读出的数据,并插入到其中具有以下结构的“表B”:

ACT ACT_TYPE 
---- -------- 
1  A 
2  B 
3  C 
4  D 

问题: * 1.如何添加“动态列名”内选择查询? *

例如,

INSERT INTO Table_B (ACT, ACT_TYPE) 
SELECT RIGHT(Act_Code,1), ## FROM Table_A 

我如何处理动态列名作为每个符号 “##” 以上?

我已经试过:

SET @sql = 'INSERT INTO Table_B (ACT,ACT_TYPE) ' 
SET @sql = @sql + 'SELECT RIGHT(Act_Code,1), ' 
SET @sql = @sql + '''ACT_TYPE_'' + RIGHT(Act_Code,1) FROM Table_A' 
EXEC (@sql) 

但它不工作!

请大家帮忙,非常感谢!

+0

您不需要动态查询。您可以在查询中使用“CASE”来选择正确列的值。 – HABO

回答

2
declare @Foo as Table (Voot varchar(10), Plevny1 varchar(10), Plevny2 varchar(10)) 
insert into @Foo (Voot, Plevny1, Plevny2) values ('Thing1', 'a', 'A'), ('Thing2', 'b', 'B') 
select SubString(Voot, 6, 1) as Vootette, 
    case SubString(Voot, 6, 1) 
    when '1' then Plevny1 
    when '2' then Plevny2 
    else NULL end as Plevny 
    from @Foo 

根据您的具体要求,您可能需要解析从控制列的值的倍数位整数,可能要处理默认输出值,可能希望检查行中的“其他”值为NULL,...。

+0

亲爱的user92546,我需要使用动态sql,因为我的表名是动态的,尽管上面的示例看起来很简单。如果要使用的情况下,“ACT_TYPE_x”字段总共有16列名称,因此我需要为动态列处理16次?谢谢。 –

+0

@ user1480519 - 是的,16'when's和可选的'else'。如果你真的需要从第一列的值中解析出来,那么需要16列来处理一位或两位选择器。如果第一列中只有16个不同的值,那么您可以直接使用它们,就像在Andomar的答案中一样。 – HABO

+0

尊敬的user92546&,经过测试,效果很好!谢谢你的帮助! –

0

貌似可以做,没有动态SQL:

insert Table_B 
     (Act, Act_Type) 
select case Act_Code 
     when 'ACT1' then 1 
     when 'ACT2' then 2 
     when 'ACT3' then 3 
     when 'ACT4' then 4 
     end 
,  coalesce(ACT_TYPE_1, ACT_TYPE_2, ACT_TYPE_3, ACT_TYPE_4) 
+0

嗨Andomar,我需要在这里得到的ACT_TYPE_1到ACT_TYPE_4的列名称,但所有这些列都有数据而不是“空”值,因此我不认为这里合并工作。还有什么想法?谢谢! –

+0

谢谢Andomar,我使用案例XX当...然后它工作!谢谢! –