使用临时表时 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'”的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 中的临时表使用

查看或临时表 - 在 MS SQL Server 中使用哪个?

SQL Server 表变量和临时表的区别

在某些情况下,为什么CTE(公用表表达式)与SQL Server中的临时表相比会减慢查询速度

关于sqlserver临时表的问题,请教高手!

如何使用C#使用相同的SQL Server连接运行foreach循环