时间:2010-07-26 01:55:51

标签: sql sql-server-2005 tsql stored-procedures

4 个答案:

答案 0 :(得分:11)

首先,在过程完成后,将删除在过程中创建的本地临时表。来自BOL on Create Table

  

存储过程完成后,将自动删除在存储过程中创建的本地临时表。该表可以由创建该表的存储过程执行的任何嵌套存储过程引用。调用创建表的存储过程的进程无法引用该表。

如果您的数据访问代码正确地打开了连接,调用存储过程然后关闭连接,那么在该过程中创建临时表会被有效破坏。

我说“有效地”提出另一点。我不建议在程序结束时删除临时表,尽管我会在创建临时表之前添加一个检查,如果存在则删除它(例如if object_id('tempdb..#Foo') is not null)。反对在最后删除临时表的论点是,通过调用Drop语句,您迫使SQL Server在等待程序结束时花费资源来销毁表。相反,如果你让它超出范围,你的程序立即结束,你让SQL Server在自己选择的时候销毁表。

答案 1 :(得分:7)

#Temp表的范围仅限于您的SESSION和批处理的生命周期,这意味着没有其他人可以看到您的临时表,其他任何人都可以使用相同的名称创建自己的#Temp表。会话或批处理结束后,SQL Server将清理临时表。

另一方面,## Temp表的行为类似于普通表。每个人都可以看到它,并且不能有超过1个## Temp表具有相同的名称。 SQL Server将在服务器重新启动时清除这些## Temp表。

答案 2 :(得分:2)

答案 3 :(得分:1)

一般情况下,通过不删除临时表可能不会有问题。本地临时表具有会话范围或SP范围。当会话关闭或SP完成时,它将自动丢弃。

但是,通过定期遵循这种做法,确实会增加问题的风险。例如,如果您不使用SP,但从ASP .net提交SELECT语句并保持SQL Server连接处于打开状态,则临时表将继续存在。继续使用连接和其他临时表将导致tempdb随时间增长。

我也支持关于在这种情况下使用临时表的其他评论。如果您创建没有临时表的解决方案,您可能会有更快的报告并且也避免使用DROP临时表命令。