2012-06-30 3 views
1

У меня есть «таблицы А» со следующей структурой: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

Уважаемый пользователь92546, мне нужно использовать динамический sql, поскольку мое имя таблицы динамическое, хотя приведенный выше пример выглядит просто. Если в случае, когда нужно использовать, у меня есть всего 16 имен столбцов для полей «ACT_TYPE_x», поэтому мне нужно обрабатывать 16 раз для динамических столбцов? Благодарю. –

+0

@ user1480519 - Да, 16 'when' и необязательный 'else'. С 16 столбцами вам нужно будет немного поработать над одним или двумя цифровыми селекторами, если вам действительно нужно разобрать его из значения первого столбца. Если в первом столбце есть только 16 различных значений, вы можете использовать их непосредственно, как в ответе Андомара. – HABO

+0

Уважаемый пользователь92546 &, протестирован, и он сработал! Спасибо за вашу помощь! –

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

Привет Андомар, мне нужно здесь, чтобы получить имя столбца для ACT_TYPE_1 в ACT_TYPE_4, но все эти столбцы имеют данные внутри, а не «Null», поэтому я не думаю, что совместная работа здесь. Есть еще идеи? благодаря! –

+0

Спасибо Andomar, я использую случай XX Когда .. ТОГДА и это сработало! Благодаря! –

Смежные вопросы