使用临时表时,SQL Server显示"无效的对象名称'#temp'"

Jeb*_*bli 16 sql-server sql-server-2005 temp-tables

我创建了一个程序

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
Run Code Online (Sandbox Code Playgroud)

当我运行该过程时,testProcedure_One我收到错误消息:

Invalid object name '#temp'
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用##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
Run Code Online (Sandbox Code Playgroud)

testProcedure_two 工作正常

可能是什么问题?我怎么解决呢?

Ada*_*Dev 17

大概你有以下来自#temp的SELECT代码,给你错误?

这取决于范围.## temp是一个全局临时表,可在其他会话中使用.#temp是"本地"临时表,只能由当前执行范围访问.sp_executesql在不同的范围内运行,因此它会将数据插入到#temp中,但如果您尝试在sp_executesql调用之外访问该表,则无法找到它.

例如,#spest创建的错误只对sp_executesql上下文可见:

EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test'
SELECT * FROM #Test
Run Code Online (Sandbox Code Playgroud)

以上工作与## Test一起使用,因为它创建了一个全局临时表.

这是有效的,因为SELECT是同一范围的一部分.

EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test; SELECT * FROM #Test'
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 你真的需要使用临时表,你能不能找到没有它们的解决方案,例如子查询?
  2. 你真的需要使用sp_executesql执行这样的sql吗?


小智 5

使用CREATE TABLE创建临时表,然后使用INSERT INTO插入值而不是 SELECT INTO。

这为我解决了问题。