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

Posted

技术标签:

【中文标题】在 SQL Server 中删除全局临时表 (##tempTable)【英文标题】:Deleting Global Temporary Tables (##tempTable) in SQL Server 【发布时间】:2010-10-15 20:51:56 【问题描述】:

SQL Server 是否会在给定时间不活动后自动清除它们,还是我需要担心自动清除它们?如果是这样,我如何查询要清除的表列表?

【问题讨论】:

【参考方案1】:

当您关闭与 SQL Server 的连接时,本地临时表将被破坏。正常情况下无需手动清除它们。如果您维护持久连接或连接池,您可能希望养成在使用后立即删除临时表的习惯。

另一方面,由于全局临时表对给定数据库中的所有用户可见,因此它们与引用它们的最后一个连接一起被销毁。

【讨论】:

我认为报告服务不会是持久连接,所以我可以吗? 我认为这对于全局临时表是不正确的;我相信需要清除全局临时表(##MyTempTable),而对于普通临时表(#MyTempTable),你所说的适用......对吗? 我发现## 全局临时表不符合它在锡上所说的那样。如果我创建了一个 Windows 程序的 3 个实例,所有实例都具有一个开放的 SQL DB 连接,并且它们都创建和/或使用一个名为 ##hello 的临时表 - 当程序关闭时,您期望会发生什么?我预计##hello 在它们全部关闭时会被丢弃。事实上,只有当创建表的程序关闭时,表才会被删除。这不是它在 MS 文档中所说的,除非它自 2012 年以来发生了变化【参考方案2】:

尽管在连接终止时会删除临时表,但通常仍认为显式删除此类表是一种很好的做法,以便绝对确定已进行清理。

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

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

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

【讨论】:

【参考方案3】:

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

SELECT * FROM tempdb..sysobjects

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

【讨论】:

谢谢,这真的很有用。【参考方案4】:

对于 SQL Server 2016 及更高版本:

DROP TABLE IF EXISTS ##tempTable;

【讨论】:

以上是关于在 SQL Server 中删除全局临时表 (##tempTable)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server :#和##,@和@@

sql server中的用户临时表和全局临时表的区别

sql server中的临时表表变量和公用表表达式

SQL SERVER 临时表能使用EXEC SP_spaceused 查询表大小么

sql数据库中#tmp什么含义?

SQL Server删除库中所有临时表或用户表