sql >> Base de Datos >  >> RDS >> Sqlserver

Pivotes con columnas dinámicas en SQL Server

Agregar esas columnas es muy simple. La consulta final sería

SELECT Account, AccountName, [Feb-11],[Jan-11],[Mar-11]   FROM   
(SELECT
t1.Col_Name,
t2.Account,
t2.AccountName,
t2.Amount
FROM Table1 AS t1
JOIN Table2 AS t2 ON t1.Col_ID1 = t2.Col_ID2
) p
PIVOT
(
Sum ([Amount] )
FOR Col_Name IN
( [Feb-11],[Jan-11],[Mar-11] )
) AS pvt 

que tiene t2.AccountName agregado a la subconsulta, y Account y AccountName agregados al SELECT inicial. Mézclelos en la declaración de compilación y listo:

DECLARE @query NVARCHAR(4000)
SET @query = N'SELECT Account, AccountName, ' +    @cols +'   FROM   

(SELECT
t1.Col_Name,
t2.Account,
t2.AccountName,
t2.Amount
FROM Table1 AS t1
JOIN Table2 AS t2 ON t1.Col_ID1 = t2.Col_ID2
) p

PIVOT
(
Sum ([Amount] )
FOR Col_Name IN
( '+
@cols +' )
) AS pvt ' 

En cuanto a la inyección de SQL, la única forma en que puedo ver que eso suceda es si alguien de alguna manera incrusta un código malicioso dentro de Table1.Col_Name, y si tiene que preocuparse por eso, tiene problemas más grandes que "bloquear" esta consulta dinámica.

También vale la pena mencionar que usaría lo siguiente para construir la lista de columnas (@Cols) porque es más corto y más fácil de leer, pero principalmente porque no me gusta XML.

DECLARE @cols NVARCHAR(2000)    
SELECT @cols = isnull(@cols + ',', '') + '[' + Col_Name + ']'
 FROM Table1
 ORDER BY Col_Name