TSQL: ¿nombre de columna dinámica en SQL dinámico?

Tengo una "tabla A" con la siguiente estructura:

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

Como puede ver, los datos de ACT_TYPE siempre se almacenarán en el nombre del campo que se refiere al último dígito de los campos "Act_Code": ej. Cuando Act_Code = "ACT1", Act_Type se almacena en el campo "ACT_TYPE_1" Cuando Act_Code = "ACT2", Act_Type se almacena en el campo "ACT_TYPE_2" y así sucesivamente...

Ahora, quiero leer los datos de la "Tabla A" anterior e insertarlos en la "Tabla B", que tiene la siguiente estructura:

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

Pregunta: *1. ¿Cómo puedo agregar un "nombre de columna dinámica" dentro de una consulta de selección?*

Por ejemplo, los servicios administrativos de

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

¿Cómo puedo manejar el nombre de la columna dinámica según el símbolo "##" anterior?

He intentado:

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)

¡Pero no funciona!

Por favor ayuda, muchas gracias!

preguntado el 30 de junio de 12 a las 19:06

No necesita una consulta dinámica. Puedes usar CASE dentro de una consulta para seleccionar el valor de la columna correcta. -

2 Respuestas

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

Dependiendo de sus requisitos específicos, es posible que deba analizar un número entero de varios dígitos del valor de la columna de control, es posible que desee manejar un valor de salida predeterminado, es posible que desee verificar que los "otros" valores en la fila sean NULL, ... .

Respondido el 30 de junio de 12 a las 19:06

Estimado usuario92546, necesito usar sql dinámico ya que el nombre de mi tabla es dinámico, aunque el ejemplo anterior parece sencillo. Si se va a usar el caso, tengo un total de 16 nombres de columnas para los campos "ACT_TYPE_x", por lo tanto, necesito manejar 16 veces para columnas dinámicas. Gracias. - marcus.el.programador

@user1480519 - Sí, 16 whens y el opcional else. Con 16 columnas, deberá trabajar un poco más para manejar el selector de uno o dos dígitos si realmente necesita analizarlo desde el valor de la primera columna. Si simplemente hay 16 valores distintos en la primera columna, puede usarlos directamente como en la respuesta de Andomar. - HABO

Estimado usuario92546 &, probado y funcionó! ¡Gracias por tu ayuda! - marcus.el.programador

Parece que puedes hacer eso sin SQL dinámico:

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)

Respondido el 30 de junio de 12 a las 19:06

Hola, Andomar, lo que necesito aquí es obtener el nombre de columna para ACT_TYPE_1 a ACT_TYPE_4, pero todas esas columnas tienen datos dentro en lugar de un valor "Nulo", por lo tanto, no creo que la fusión funcione aquí. ¿Alguna idea más? ¡Gracias! - marcus.el.programador

Gracias Andomar, uso Case XX When.. THEN y funciono! ¡Gracias! - marcus.el.programador

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.