2012-06-30 41 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當...然後它工作!謝謝! –