Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Pivôs com colunas dinâmicas no SQL Server


Adicionar essas colunas é muito simples. A consulta final seria
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 tem t2.AccountName adicionado à subconsulta e Account e AccountName adicionados ao SELECT inicial. Jogue-os na instrução de construção e pronto:
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 ' 

Quanto à injeção de SQL, a única maneira de ver isso acontecer é se alguém de alguma forma incorporar código malicioso em Table1.Col_Name, e se você tiver que se preocupar com isso, terá problemas maiores do que "bloquear" essa consulta dinâmica.

Também vale a pena mencionar, eu usaria o seguinte para construir a lista de colunas (@Cols) porque é mais curta e fácil de ler, mas principalmente porque não gosto de XML.
DECLARE @cols NVARCHAR(2000)    
SELECT @cols = isnull(@cols + ',', '') + '[' + Col_Name + ']'
 FROM Table1
 ORDER BY Col_Name