L'aggiunta di quelle colonne è molto semplice. La domanda finale sarebbe
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
che ha t2.AccountName aggiunto alla sottoquery e Account e AccountName aggiunti alla SELECT iniziale. Lanciali nella dichiarazione di build e il gioco è fatto:
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 '
Per quanto riguarda l'iniezione SQL, l'unico modo in cui posso vedere che ciò accade è se qualcuno in qualche modo incorpora codice dannoso all'interno di Table1.Col_Name e se devi preoccuparti di questo, hai problemi più grandi del "blocco" di questa query dinamica.
Vale anche la pena ricordare che userei quanto segue per creare l'elenco di colonne (@Cols) perché è più breve e più facile da leggere, ma soprattutto perché non mi piace XML.
DECLARE @cols NVARCHAR(2000)
SELECT @cols = isnull(@cols + ',', '') + '[' + Col_Name + ']'
FROM Table1
ORDER BY Col_Name