在SQL Server中删除全局临时表(##tempTable)

23

SQL服务器是否会在一段时间的不活动后自动清除这些内容,还是需要我手动清除?如果需要手动清除,请问如何查询要清除的表格列表?

4个回答

27

虽然临时表在连接终止时被删除,但通常仍被视为良好的实践,在确保清理已完成的情况下显式地删除这些表。

例如,如果您的平台使用连接池,即连接可能永远不会断开,那么您的临时表是否仍然存在?

为了检查临时表是否存在,可以使用以下语句/检查。

if object_id('tempdb..##temptbl') is not null
begin
    drop table ##temptbl
end

16

当您关闭与 SQL Server 的连接时,本地临时表将被销毁。在正常情况下,没有必要手动清除它们。如果您保持持久连接或连接池,则可能需要养成立即在使用后删除临时表的习惯。

另一方面,全局临时表可以被给定数据库中的所有用户看到,因此它们将随着最后一个引用它们的连接一起被销毁。


我假设报告服务不会是持久连接,所以我没问题吗? - Jeff
7
我认为对于全局临时表这种情况是不正确的;我认为需要清除全局临时表(##MyTempTable),而对于普通临时表(#MyTempTable),您所说的应该是适用的……对吗? - Frank V
1
我发现全局临时表并不像它所说的那样。如果我创建3个带有打开SQL DB连接的Windows程序实例,并且它们都创建和/或使用名为##hello的临时表,当这些程序关闭时,您会期望发生什么?我期望##hello在它们全部关闭时被删除。实际上,只有创建表的程序关闭时才会删除该表。除非自2012年以来发生了变化,否则MS文档中没有这种情况。 - Cato

4

回答你问题的第二部分,要查询需要清除的表格列表,请尝试以下查询:

SELECT * FROM tempdb..sysobjects

那将列出所有当前的全局临时表。

1

由于大多数用户通过搜索引擎来寻找问题的答案,因此本文将介绍如何在SQL Server 2016及更高版本中删除全局临时表:

DROP TABLE IF EXISTS ##tempTable;

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