2015-10-31 51 views
0

我有一個表無法正確執行Dynamic Pivot?

DECLARE @T TABLE(Val1 VARCHAR(20), Id INT, Val2 INT) 
INSERT INTO @T VALUES 
    ('X',1,2), 
    ('Y',2,3) 

如果我想運行一個PIVOT(靜態),查詢

SELECT ID, [X],[Y] from @T    
       PIVOT 
       (
        MAX(Val2) 
        FOR Val1 IN ([X],[Y]) 
       ) AS X   
       ORDER BY 1 

它將按預期工作。我們如何在Dynamic PIVOT中執行相同的操作?

我嘗試

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(Val1) 
        from @T     
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = N'SELECT ID, ' + @cols + N' from @T    
      PIVOT 
      (
       MAX(Val2) 
       FOR Val1 IN (' + @cols + N') 
      ) AS X   
      ORDER BY 1' 

exec sp_executesql @query 

錯誤:

Msg 1087, Level 15, State 2, Line 1 
Must declare the table variable "@T". 

回答

1

動態SQL是在不同的上下文中執行,因此不會有表變量。改用臨時表(#T)。