sql - 在存储过程中使用同名的临时表

标签 sql sql-server stored-procedures temp-tables temp

如果我在 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/

相关文章:

sql-server - 在 SQL Server 中有条件地创建用户

mysql - 如果语句为 1,则运行特定的 SQL 语句

sql - 这个sql查询可以简化吗?

sql - 如何在具有varchar类型列的表中添加一行,一个带引号的单词?

c# - 查询代码非常慢,但在 SSMS 中查询速度很快

sql - 使用 'no-symbol' 字符串搜索越南语单词

java - 如何在android中使用更新语句

.net - Sql Server Xml 数据类型 - 如何强制完整结束元素

database - 在没有 CrossTab 的 Crystal 报表中每行和每列添加 "Total"

java - H2 数据库中的存储过程