使用临时表时 SQL Server 显示“无效的对象名称 '#temp'”
Posted
技术标签:
【中文标题】使用临时表时 SQL Server 显示“无效的对象名称 \'#temp\'”【英文标题】:SQL Server shows "Invalid object name '#temp'" when working with a temporary table使用临时表时 SQL Server 显示“无效的对象名称 '#temp'” 【发布时间】:2010-11-18 22:16:25 【问题描述】:我已经创建了一个过程
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
工作正常
可能是什么问题?我该如何解决?
【问题讨论】:
【参考方案1】:大概您有以下代码从#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'
我的问题是:
-
您真的需要使用临时表吗,如果没有它们,您是否找不到解决方案,例如使用临时表?子查询?
您真的需要使用 sp_executesql 执行这样的 sql 吗?
【讨论】:
谢谢。我知道它超出了范围,但我没有想到我必须使用相同的查询进行选择。【参考方案2】:使用 CREATE TABLE 创建临时表,然后使用 INSERT INTO 而不是 SELECT INTO 插入值。
这解决了我的问题。
【讨论】:
【参考方案3】:为了让您执行,我认为应该首先使用 ddl 语句创建#tmp_table。
然后你执行你的 exec 并且你在 exec 中创建的存储过程应该具有相同的名称temp table viz.#tmp_table
。
【讨论】:
以上是关于使用临时表时 SQL Server 显示“无效的对象名称 '#temp'”的主要内容,如果未能解决你的问题,请参考以下文章
查看或临时表 - 在 MS SQL Server 中使用哪个?