在SQL Server中,创建、使用和删除临时表的首选方法是什么?

3

在 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

我在这个答案和相关评论中读到,这在临时表被重复使用的情况下可能是有用的,SQL Server会截断表但保留结构以节省时间。

我的存储过程可能会经常被调用,但它只包含几列,所以我不确定这对我的情况是否真的有优势。


或者使用 SELECT/INTO 隐式地创建表。 - HABO
1
@HABO 这有什么帮助吗?如果表已经存在,就会出现错误,问题仍然是需要删除它吗 - 如果使用SELECT INTO创建表,为什么这个问题会消失呢? - Aaron Bertrand
@AaronBertrand - 抱歉,我以为标题中看到了“创建”这个词。知道你对完整性的追求,我觉得提出SELECT/INTO的问题并不完全离题。再次道歉。 - HABO
3个回答

2
你可以测试并查看在你的情况下哪种方法表现更好。我听说过这种重用的好处,但我自己没有进行过任何广泛的测试。(我的直觉是明确删除我创建的任何#temp对象。)
在单个存储过程中,你不需要检查表是否存在 - 除非可能该存储过程也被另一个可能使用相同名称创建表的存储过程调用。这就是为什么好的实践是有意义地命名#temp表而不是使用#t、#x、#y等的原因。

我的临时表按照你的建议从另一个表中调用。它可能会在相对快速的连续时间内被多次调用。我曾经选择过方法1,但总是担心在错误情况下,是否会出现没有调用删除的情况。我最近才了解到方法2,并且目前正在使用它。它运行良好,但我只是想确保它不会因为某种原因被认为是不良实践。 - Mr Moose
1
即使在错误条件下,如果存储过程中止,存储过程将退出并删除表。您可以始终将创建表放在TRY内部,并将删除表放在CATCH内部,这将更明确地处理大多数错误条件(但我仍然认为您的担忧是没有根据的)。 - Aaron Bertrand
1
谢谢。我相信很多我的担忧都是没有根据的。我就是个小心谨慎的人 :) - Mr Moose

1
我遵循这种方法:

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

原因:如果存储过程中发生错误,并且创建的临时表未被删除,当使用检查存在性调用相同的存储过程时,将引发错误,表无法创建,并且除非删除该表,否则永远无法成功执行。因此,在创建对象之前始终执行存在性检查。

0

在使用临时表时,我的首选做法实际上是将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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接