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 将截断表但保留结构以节省时间。

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

4

3 回答 3

2

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

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

于 2012-09-06T14:47:42.190 回答
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

原因:如果 sproc 发生错误,并且创建的 temp table 没有被删除,当调用同一个 sproc 并检查是否存在时,会出现无法创建 table 的错误,并且永远不会成功执行,除非 table 是掉了。所以总是在创建对象之前检查它的存在。

于 2012-09-06T17:51:55.613 回答
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
于 2012-09-06T15:05:48.983 回答