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

时间:2009-08-12 11:09:29

标签: 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

当我运行程序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 个答案:

答案 0 :(得分:16)

大概你有以下代码从#temp中选择SELECT,给你错误吗?

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

e.g。 创建#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. 你真的需要使用sp_executesql执行这样的sql吗?

答案 1 :(得分:2)

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

这解决了我的问题。

答案 2 :(得分:1)

让你执行我认为应该首先使用ddl语句创建#tmp_table。

然后执行你的exec,你在exec中创建的存储过程应该具有相同的名称temp table viz.#tmp_table