SQL删除临时表

时间:2018-04-23 20:44:26

标签: sql sql-server database

在存储过程中删除表是一种更好的做法吗?

示例A

IF OBJECT_ID('tempdb..#tTable1') IS NOT NULL
  DROP TABLE #tTable1
CREATE TABLE #tTable1

示例B

CREATE TABLE #tTable1
select * from #tTable1
Drop TABLE #tTable1

2 个答案:

答案 0 :(得分:5)

您正在处理本地临时表。你不需要那么担心。

存储过程在返回时会自动删除临时表,因此您无需担心临时表会延迟。我花了一段时间才习惯这种行为,但由于这种行为是documented,你可以依赖它:

  
      
  • 删除在存储过程中创建的本地临时表   存储过程完成后自动完成。
  •   

这是本地声明的临时表在SQL Server中的工作方式。这只是他们定义的语义。

当然,您可能会担心在外部存储过程创建的临时表。但大肆抛弃这些赌桌可能很危险。

当多次调用存储过程时,您不必担心命名冲突:

  

如果在存储过程中创建了本地临时表,或者   可以由多个用户同时执行的应用程序,   数据库引擎必须能够区分由其创建的表   不同的用户。数据库引擎在内部完成此操作   将数字后缀附加到每个本地临时表名。

这一切都有一些细微差别。因为临时表使用公共名称空间来表示约束名称,所以如果添加自己的名称,则需要小心。

在不再需要临时表时删除临时表没有任何问题。我只是指出这不是必要的。

作为优先选择,我更喜欢表变量而不是临时表。更清楚的是,它们的范围在存储过程中,与其他变量的方式相同。

答案 1 :(得分:3)

我会推荐两者。我之前在同一个过程中编码过,没有人抱怨冗余代码或不遵循DRY。使用表完成proc时,最好不要使用它,因此它不使用资源。特别是如果会话由于某种原因保持打开状态,该表将持续到会话结束或直到您放弃该表。

如果选择1,请使用第一个选项。如果在您的表中引入奇怪的数据并且您从函数中抛出异常,则代码可能无法进入drop部分。然后,如果同一会话再次运行proc,则boom,object已经存在。无论proc何时执行,存在检查都将删除临时表。