2015-10-31 7 views
0

У меня есть таблицаНе удалось выполнить правильный динамический поворот?

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).