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我收到错误消息:
Run Code Online (Sandbox Code Playgroud)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
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)
我的问题是: