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'

мои вопросы:

  1. вам действительно нужно использовать временные таблицы, вы не можете найти решение без них, используя, например, подзапрос?
  2. вам действительно нужно выполнить sql, как это, используя процедуры sp_executesql?

для выполнения я думаю, что #tmp_table должен быть создан сначала с помощью оператора ddl.

затем выполняется Exec и хранимой тез создан в exec должен иметь то же имя temp table viz.#tmp_table.


создать временную таблицу с помощью СОЗДАТЬ ТАБЛИЦУ и затем использовать ВСТАВИТЬ В чтобы вставить значения вместо SELECT INTO.

это исправили проблему для меня.