2012-11-16 3 views
0

Я хочу создать временную таблицу в динамическом запросе и использовать ее впоследствии. Он будет создан из постоянной таблицы:Динамически созданная временная таблица не сохраняется

create table t (a integer); 
insert into t values (1); 

И создание временной таблицы, как это:

declare @command varchar(max) = ' 
    select * 
    into #t 
    from t 
    ; 
    select * from #t; 
'; 
execute (@command); 

Когда @command выполняется в select from временных работы таблицы.

Теперь, если выбрать из временной таблицы сообщение об ошибке показано ниже:

select * from #t; 

Invalid object name '#t' 

Если временная таблица создается вне динамического запроса он работает:

select top 0 * 
into #t 
from t 

declare @command varchar(max) = ' 
    insert into #t 
    select * 
    from t 
'; 
execute (@command); 

select * from #t; 

Можно ли сохранить динамически создаваемую временную таблицу?

ответ

1

Вы также можете создавать глобальные временные таблицы. Например, ## MyTemp. Но глобальные временные таблицы видны всем соединениям SQL Server.

+0

Я тестировал и работает. Поэтому я предполагаю, что проблема заключается в том, что динамический запрос выполняется в другом сеансе или что-то в этом роде? Я не буду использовать глобальную временную битву. –

+0

Я использую их со всеми строковыми законами в некоторых процедурах, имена таблиц здесь генерируются из NEW_ID(). Мне это не нравится, но есть некоторые особые случаи длительных сложных процедур. – bummi

2

Вы близки в своем предположении, что EXECUTE выполняется в другой сессии.

Согласно MSDN here

Выполняет командную строку или строку символов в пределах Transact-SQL партии

Так что ваша временная таблица существует только внутри объема SQL, выполняемого посредством EXECUTE команда.

+0

Это потому, что транзакция выполняется в другом сеансе, а не из-за самой транзакции? Глобальная временная выживаемость транзакции. –

+0

AFAIK все должно выполняться в том же сеансе, ПОЧЕМУ глобальные темпы выходят за транзакцию, которую я не знаю, но они не выживают, если выполняемый SQL-транзакция завершена: (вам нужно запустить это локально) http: // sqlfiddle.com/#!3/b6819/2 – Paddy

Смежные вопросы