SQL Server показывает "недопустимое имя объекта "#temp" " при работе с временной таблицей
Я создал процедуру
create procedure testProcedure_One
as
DECLARE @Query nvarchar(4000)
begin
SET @Query = 'SELECT * into #temptest FROM Table1'
Exec sp_Executesql @query
SELECT * FROM #temptest
drop table #temptest
end
когда я запускаю процедуру testProcedure_One
Я получаю сообщение об ошибке:
Invalid object name '#temp'
но если я использую ##temp means
работает:
create procedure testProcedure_two
as
DECLARE @Query nvarchar(4000)
begin
SET @Query = 'SELECT * into ##temptest FROM Table1'
Exec sp_Executesql @query
SELECT * FROM ##temptest
drop table ##temptest
end
testProcedure_two
работает отлично
в чем может быть проблема? Как я могу ее решить?
3 ответов
предположительно, у вас есть следующий код, который выбирает из #temp, давая вам ошибку?
Это объем. ##temp-это глобальная временная таблица, доступная в других сеансах. #temp-это" локальная " временная таблица, доступная только для текущей области выполнения. sp_executesql работает в другой области, поэтому он вставит данные в #temp, но если вы попытаетесь получить доступ к этой таблице вне вызова sp_executesql, он не найдет ее.
например, Это ошибки как #Test создан и виден только контексту sp_executesql:
EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test'
SELECT * FROM #Test
выше работает с # # Test, поскольку он создает глобальную временную таблицу.
это работает, так как SELECT является частью той же области.
EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test; SELECT * FROM #Test'
мои вопросы:
- вам действительно нужно использовать временные таблицы, вы не можете найти решение без них, используя, например, подзапрос?
- вам действительно нужно выполнить sql, как это, используя процедуры sp_executesql?
для выполнения я думаю, что #tmp_table должен быть создан сначала с помощью оператора ddl.
затем выполняется Exec и хранимой тез создан в exec должен иметь то же имя temp table viz.#tmp_table
.
создать временную таблицу с помощью СОЗДАТЬ ТАБЛИЦУ и затем использовать ВСТАВИТЬ В чтобы вставить значения вместо SELECT INTO.
это исправили проблему для меня.