Использование временной таблицы с exec @sql в хранимой процедуре

У меня есть хранимая процедура и часть из них, как показано ниже: @DRange - это входящее значение varchar

declare @sql varchar(max)
set @sql = 'select * into #tmpA from TableA where create_date >= getDate - ' + @DRange + '' and is_enabled = 1'

exec (@sql)

select * from #tmpA

Проблема в том, что когда я выполняю хранимую процедуру, появляется сообщение об ошибке: Не удается найти объект "#tmpA", поскольку он не существует или у вас нет разрешений.

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


person William Tang    schedule 24.10.2013    source источник
comment
Почему вы используете динамический SQL? У вас нет нормального запроса select * into #tmpA from TableA where create_date >= getDate - @DRange and is_enabled = 1 ? При необходимости конвертируйте @DRange в другой тип   -  person Yuriy Galanter    schedule 24.10.2013
comment
Потому что мне нужно будет объединить в запрос другой параметр, например имя базы данных.   -  person William Tang    schedule 24.10.2013


Ответы (2)


#tmpA создается в другой области, поэтому не виден за пределами динамического SQL. Вы можете просто сделать окончательную SELECT частью динамического SQL. Также еще пара вещей:

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'select * into #tmpA from dbo.TableA 
    where create_date >= DATEADD(DAY, -@DRange, GETDATE())
    AND is_enabled = 1; SELECT * FROM #tmpA';

EXEC sp_executesql @sql, N'@DRange INT', @DRange;

Конечно, если все, что вы делаете, это выбираете, мне трудно понять, почему это динамический SQL в первую очередь. Я предполагаю, что ваш запрос (или то, что вы позже сделаете с временной таблицей) более сложен, чем этот, - если это так, не надо нам его тупить. Рассказав нам всю свою проблему, вы предотвратите множество споров, так как дополнительные детали могут изменить ответ.

person Aaron Bertrand    schedule 24.10.2013
comment
Спасибо за ваш комментарий, я использовал ##tmpA вместо #tmp, и проблема решена. - person William Tang; 24.10.2013
comment
@WilliamTang нет, не было. Вы знаете, что делает ##tmpA? Это создает ГЛОБАЛЬНУЮ временную таблицу. Угадайте, что происходит, когда два человека запускают эту хранимую процедуру одновременно (независимо от диапазона дат или параметров базы данных). - person Aaron Bertrand; 24.10.2013

Вот что я бы сделал.

declare @sql varchar(max)

set @sql = 'select * from TableA where create_date >= getDate - ' + @DRange + '' and is_enabled = 1'

Select * Into #tmpA from TableA where create_date = '01/01/1000' -- to create a blank table

insert into #tmpA

exec (@sql)

select * from #tmpA
person Sani    schedule 18.08.2017