【问题标题】:What is the preferred method of creating, using and dropping temp tables in sql server?在 sql server 中创建、使用和删除临时表的首选方法是什么?
【发布时间】:2012-09-06 14:45:17
【问题描述】:

在 SQL Server 存储过程中使用临时表时,首选做法是;

1) 创建临时表,填充它,使用它然后删除它

CREATE TABLE #MyTable ( ... )

-- Do stuff

DROP TABLE #MyTable

2) 检查是否存在,如果存在则删除它,然后创建并使用它

IF object_id('tempdb..#MyTable') IS NOT NULL
DROP TABLE #MyTable

CREATE TABLE #MyTable ( ... )

3) 创建它并在超出范围时让 SQL Server 清理它

CREATE TABLE #MyTable ( ... )

-- Do Stuff

我在this answer 及其关联的 cmets 中读到,这在临时表被重用的情况下很有用,SQL Server 将截断表但保留结构以节省时间。

我的存储过程可能会被非常频繁地调用,但它只包含几列,所以我不知道这在我的情况下到底有多有利。

【问题讨论】:

  • 或者使用SELECT/INTO隐式创建表。
  • @HABO 这有什么帮助?如果表已经存在,则会发生错误,问题仍然是是否需要删除它 - 如果表是使用 SELECT INTO 创建的,为什么这个问题会消失?
  • @AaronBertrand - 抱歉,我以为我在标题中看到了“创造”这个词。知道您对完整性的偏好,我觉得提出SELECT/INTO 的问题并非完全偏离主题。再一次,我是罪魁祸首。

标签: sql-server temp-tables


【解决方案1】:

您可以测试并查看在您的场景中一种方法是否优于另一种方法。我听说过这种重用优势,但我自己没有进行任何广泛的测试。 (我的直觉是明确删除我创建的所有 #temp 对象。)

在单个存储过程中,您永远不必检查表是否存在 - 除非也有可能从另一个可能已创建同名表的过程调用该过程。这就是为什么最好有意义地命名#temp 表而不是使用#t、#x、#y 等。

【讨论】:

  • 按照您的建议,我的临时表是从另一个表调用的。它可以相对快速地连续调用任意次数。我曾经选择方法 1,但总是担心在错误情况下,我是否会在没有调用 drop 的情况下结束。我最近才遇到方法 2,这就是我目前正在使用的方法。它工作正常,但我只是想确保它不会因为某种原因被认为是不好的做法。
  • 即使在发生错误的情况下,如果存储过程中止,存储过程也会退出,表也会被删除。您总是可以将创建表放在 TRY 中并将表放在 CATCH 中,这将更明确地处理大多数错误情况(但我仍然认为您的担忧是没有根据的)。
  • 谢谢。我敢肯定,我的很多担忧都是没有根据的。我是个担心的疣:)
【解决方案2】:

我遵循这种方法:


IF object_id('tempdb..#MyTable') IS NOT NULL

DROP TABLE #MyTable

  CREATE TABLE #MyTable ( ... )

  // Do Stuff

IF object_id('tempdb..#MyTable') IS NOT NULL

DROP TABLE #MyTable

原因:如果 sproc 发生错误,并且创建的 temp table 没有被删除,并且当调用相同的 sproc 并检查是否存在时,将引发无法创建 table 的错误,并且永远不会成功执行,除非表被删除。因此,在创建对象之前,请务必检查其是否存在。

【讨论】:

    【解决方案3】:

    使用临时表时,我的首选做法实际上是 1 和 2 的组合。

      IF object_id('tempdb..#MyTable') IS NOT NULL
         DROP TABLE #MyTable
    
      CREATE TABLE #MyTable ( ... )
    
      // Do Stuff
    
      IF object_id('tempdb..#MyTable') IS NOT NULL
         DROP TABLE #MyTable
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      相关资源
      最近更新 更多