我创建了一个程序
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
工作正常
可能是什么问题?我该如何解决?
答案 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)
使用 CREATE TABLE 创建临时表,然后使用 INSERT INTO 插入值而不是SELECT INTO。
这解决了我的问题。
答案 2 :(得分:1)
让你执行我认为应该首先使用ddl语句创建#tmp_table。
然后执行你的exec,你在exec中创建的存储过程应该具有相同的名称temp table viz.#tmp_table
。