Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pivots avec colonnes dynamiques dans SQL Server

L'ajout de ces colonnes est très simple. La requête finale serait

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 

qui a t2.AccountName ajouté à la sous-requête, et Account et AccountName ajoutés au SELECT initial. Ajoutez-les à l'instruction de construction et vous avez terminé :

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 ce qui concerne l'injection SQL, la seule façon dont je peux voir que cela se produit est si quelqu'un intègre d'une manière ou d'une autre un code malveillant dans Table1.Col_Name, et si vous devez vous en soucier, vous avez de plus gros problèmes que de "verrouiller" cette requête dynamique.

Il convient également de mentionner que j'utiliserais ce qui suit pour créer la liste des colonnes (@Cols) parce que c'est plus court et plus facile à lire, mais surtout parce que je n'aime pas XML.

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