Figure 13 Constructing a Dynamic Query String
กก
CREATE INDEX idx_nc_OrderDate ON SalesOrderHeader(OrderDate)

DECLARE @sql AS NVARCHAR(4000), @dt AS DATETIME

SET @sql = 
  N'WITH OrdersCTE(SalesPersonID, OrderYear, OrderValue)
AS
(
  SELECT
    SOH.SalesPersonID, 
    YEAR(SOH.OrderDate),
    SOD.OrderQty * SOD.UnitPrice
  FROM SalesOrderHeader AS SOH
    JOIN SalesOrderDetail AS SOD
      ON SOD.SalesOrderID = SOH.SalesOrderID
)
SELECT *
FROM OrdersCTE
  PIVOT(SUM(OrderValue) FOR OrderYear IN('

SET @dt = 
  (SELECT CONVERT(CHAR(4), YEAR(MIN(OrderDate))) + '0101'
   FROM SalesOrderHeader)

WHILE @dt IS NOT NULL
BEGIN
  SET @sql = @sql + N'[' + CAST(YEAR(@dt) AS NCHAR(4)) + N']'

  SET @dt = 
    (SELECT CAST(YEAR(MIN(OrderDate)) AS CHAR(4)) + '0101'
     FROM SalesOrderHeader
     WHERE OrderDate >= DATEADD(year, 1, @dt))

  IF @dt IS NOT NULL SET @sql = @sql + N','
END

SET @sql = @sql + N')) AS P'

EXEC sp_executesql @sql