如果我在 SQL Server 2012 中有一个非常基本的存储过程,如下所示:
Create Procedure [MyStoredProcedure] (@ input as int)
As
Select 1 as col1, 2 as Col2
Into #mytemp1
Drop Table #mytemp1
Select 3 as col1, 4 as Col2, 5 as Col3
Into #mytemp1
Drop Table #mytemp1
我尝试运行它,但失败并显示错误“数据库中已有一个名为“#mytemp1”的对象。” 如果这不是一个存储过程,我可以在最初删除临时表后使用 GO。 有没有解决的办法? 谢谢
最佳答案
由于没有明确需要重复使用相同的临时表名称,因此只需为每个临时表使用唯一的名称即可。
嗯,技术上你可以做如下的事情:
EXEC('
Select 1 as col1, 2 as Col2
Into #mytemp1
something else related to #mytemp1
');
EXEC('
Select 3 as col1, 4 as Col2, 5 as Col3
Into #mytemp1
something else related to #mytemp1
');
这不会失败,因为每个临时表都隔离在一个子进程中,直到 EXEC
实际运行时才会对其进行解析。并且,当EXEC
完成时,临时表就会消失(因此不需要显式的DROP
语句)。但在大多数情况下,这不是一个实用的解决方案,因为创建临时表的典型目的是将这些数据携带到其他操作中,但在这里这些临时表仅在其特定的 EXEC 上下文中可行,所以有点有限。
关于sql - 在存储过程中使用同名的临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27540140/