es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Seleccionar columnas dinámicas con nombres de otra tabla.

Tengo 2 tablas, una que contiene IDs y atributos de datos y otra que contiene descripciones de atributos.

Lo que necesito hacer es leer la columna de ID y todos los atributos (que deben ser dinámicos, ya que podrían agregar más atributos más adelante), pero con las descripciones de Table2 como encabezados de columna.
(NB: Los atributos no tienen nombres similares, por lo que no puedo simplemente leer donde el nombre de la columna comienza con ‘Attr’ o algo así).

Tabla 1:

ID Descripción_ID Col1 aAttr1 xAttr2 yAttr3 zAttr4
1 Primer Thing Blah 103 Gtr A1
2 Segundo Thing Blah 52 Hte B2 U123
3 Tercer Thing Blah 17 xxx xx xxx

Tabla 2

Attr_ID Attr_Desc
aAttr1 Sitio
xAttr2 Área
yAttr3 Rack
zAttr4 Estante

Entonces, necesito extraer ID más todas las columnas de Table 1 que tienen una entrada en la columna Attr_ID de Table 2 y reemplazar los encabezados de columna por la entrada Attr_Desc de Table 2:

ID Sitio Área Rack Estante
1 103 Gtr A1
2 52 Hte B2 U123
3 17 xxx xx xxx

Cualquier sugerencia sería agradecida.

Gracias por mirar.

  • Editar *
    Sé que puedo usar una búsqueda de INFORMATION_SCHEMA.COLUMNS para obtener los nombres de columna, pero no sé cómo (o incluso si puedo) incorporar eso en la instrucción SELECT general y luego reemplazar los nombres de columna con las descripciones de la tabla 2:

SELECT [Column_Name] DE INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N’Table1′
y Column_Name en (select Attr_ID de [dbo].[Table2])

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener la salida deseada, se puede usar SQL dinámico para seleccionar todas las columnas requeridas de la Tabla 1 y reemplazar sus nombres con las descripciones correspondientes de la Tabla 2. Aquí hay una consulta de ejemplo que debería funcionar:

    DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
    
    -- Obtener todas las columnas de atributos y sus descripciones de la Tabla 2
    SELECT @cols = STUFF((SELECT ',' + QUOTENAME(Attr_Desc)
                         FROM Table2
                         WHERE Attr_ID IN (SELECT COLUMN_NAME
                                           FROM INFORMATION_SCHEMA.COLUMNS
                                           WHERE TABLE_NAME = 'Table1'
                                             AND COLUMN_NAME LIKE 'Attr%')
                         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
    
    -- Construir la consulta SQL dinámica para seleccionar las columnas requeridas
    SET @query = 'SELECT ID, ' + @cols + '
                  FROM (
                    SELECT ID, ' + (SELECT COLUMN_NAME + ', ' FROM INFORMATION_SCHEMA.COLUMNS
                                      WHERE TABLE_NAME = 'Table1'
                                        AND COLUMN_NAME LIKE 'Attr%'
                                        AND COLUMN_NAME IN (SELECT Attr_ID FROM Table2)
                                      FOR XML PATH('')) + '0 AS dummy
                    FROM Table1
                  ) t
                  UNPIVOT (
                    value FOR col IN (' + (SELECT COLUMN_NAME + ', ' FROM INFORMATION_SCHEMA.COLUMNS
                                           WHERE TABLE_NAME = 'Table1'
                                             AND COLUMN_NAME LIKE 'Attr%'
                                             AND COLUMN_NAME IN (SELECT Attr_ID FROM Table2)
                                           FOR XML PATH('')) + 'dummy'
                    + ')
                  ) u
                  JOIN Table2 ON u.col = Table2.Attr_ID';
    
    -- Ejecutar la consulta SQL dinámica y obtener el conjunto de resultados
    EXEC sp_executesql @query;
    

    La consulta anterior primero obtiene todas las columnas de atributos y sus descripciones de la Tabla 2 utilizando una subconsulta y las funciones STUFF y QUOTENAME para construir una lista separada por comas de nombres de columna encerrados en corchetes. Luego utiliza SQL dinámico para construir la cadena de consulta final concatenando las columnas seleccionadas y sus alias, y las operaciones de unión y despliegue necesarias. El operador UNPIVOT convierte las columnas de atributos en filas, y la unión con la Tabla 2 reemplaza los nombres de las columnas con sus descripciones reales.

    Tenga en cuenta que el SQL dinámico debe usarse con precaución ya que puede introducir vulnerabilidades de seguridad si no se maneja adecuadamente, como ataques de inyección SQL. Además, el rendimiento de la consulta puede no ser óptimo para tablas grandes, por lo que puede ser necesario considerar técnicas de optimización o indexación.

Comments are closed.