Het toevoegen van die kolommen is heel eenvoudig. De laatste vraag zou zijn
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
waarbij t2.AccountName is toegevoegd aan de subquery en Account en AccountName zijn toegevoegd aan de initiële SELECT. Gooi ze in de build-verklaring en je bent klaar:
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 '
Wat betreft SQL-injectie, de enige manier waarop ik kan zien dat dit gebeurt, is als iemand op de een of andere manier kwaadaardige code insluit in Table1.Col_Name, en als je je daar zorgen over moet maken, heb je grotere problemen dan het "vergrendelen" van deze dynamische query.
Ook het vermelden waard, ik zou het volgende gebruiken om de lijst met kolommen (@Cols) samen te stellen omdat het korter en gemakkelijker te lezen is, maar vooral omdat ik niet van XML houd.
DECLARE @cols NVARCHAR(2000)
SELECT @cols = isnull(@cols + ',', '') + '[' + Col_Name + ']'
FROM Table1
ORDER BY Col_Name