2016-02-22 2 views
0

Я пытаюсь вставить скользящую таблицу, которая выполняется в строке в таблицу temp, #temp. исходный код выглядит следующим образом.select sql pivot table

declare @list as varchar(max) 
declare @sql varchar(max) 
SELECT @list = COALESCE(@list + ',[' + cast(rank as varchar) + ']', '[' + cast(rank as varchar)+ ']') 
from (
    select distinct rank 
    from #pp 
    where INSTR_ROLE = 'PI' 
) x 

set @sql ='select distinct * from (SELECT DISTINCT A.EMPLID AS EMPLID, 
       ''Yes'' AS prime, 
       (A.SUBJECT + '' '' + A.CATALOG_NBR) AS Class, 
       rank 
     FROM #pp A 
     WHERE (A.INSTR_ROLE = ''PI'') 
) as s 
pivot (max(class) 
    for rank in ('[email protected]+') 
) as pvt' 

exec(@sql) 

Мой метод создания таблицы является указанием select into #temp, но когда я EXEC, это говорит #temp таблица не была найдена. есть ли способ достичь этого?

set @sql ='select distinct * into #temp from (SELECT DISTINCT A.EMPLID AS EMPLID, 
       ''Yes'' AS prime, 
       (A.SUBJECT + '' '' + A.CATALOG_NBR) AS Class, 
       rank 
     FROM #pp A 
     WHERE (A.INSTR_ROLE = ''PI'') 
) as s 
pivot (max(class) 
    for rank in ('[email protected]+') 
) as pvt' 

ответ

2

Временную таблицу, созданную внутри динамического запроса, нельзя получить за пределами динамического запроса.

Динамический запрос будет иметь другой сеанс из текущего сеанса, в котором выполняется динамический запрос. Поэтому, когда вы пытаетесь выбрать временную таблицу динамического запроса, где временная таблица, созданная внутри динамического запроса, будет вызывать ошибку, поскольку temp не существует.

Но при попытке выбрать временную таблицу внутри динамического запроса она будет работать.

set @sql ='select distinct * into #temp from (SELECT DISTINCT A.EMPLID AS EMPLID, 
       ''Yes'' AS prime, 
       (A.SUBJECT + '' '' + A.CATALOG_NBR) AS Class, 
       rank 
     FROM #pp A 
     WHERE (A.INSTR_ROLE = ''PI'') 
) as s 
pivot (max(class) 
    for rank in ('[email protected]+') 
) as pvt; 

select * from #temp' 

Если запрос не будет выполняться параллельно в разных сеансах вы можете использовать global temp table вместо временной таблицы.

Доступ к глобальным временным таблицам можно получить за пределами динамического запроса, даже если он создан внутри динамического запроса.

set @sql ='select distinct * into ##temp from (SELECT DISTINCT A.EMPLID AS EMPLID, 
       ''Yes'' AS prime, 
       (A.SUBJECT + '' '' + A.CATALOG_NBR) AS Class, 
       rank 
     FROM #pp A 
     WHERE (A.INSTR_ROLE = ''PI'') 
) as s 
pivot (max(class) 
    for rank in ('[email protected]+') 
) as pvt' 

select * from ##temp 
+0

Как создать таблицу внутри динамического запроса и получить доступ к стороне запроса? – Xiao

+1

@XiaojunXu - обновленная проверка сейчас –