SQL Server中的本地和全局临时表

SQL Server中的本地和全局临时表有什么区别?

我觉得这个解释很清楚(这是Technet的纯粹的副本):

有两种types的临时表:本地和全局。 本地临时表只有在与SQL Server实例相同的连接期间才能与其创build者一样可见,就像第一次创build或引用表时一样。 用户从SQL Server实例断开连接后删除本地临时表。 全局临时表在任何用户和任何连接创build之后都是可见的,并且当引用该表的所有用户从SQL Server实例断开连接时,全局临时表将被删除。

  • 表variablesDECLARE @t TABLE )仅对创build它的连接可见,并在批处理或存储过程结束时删除。

  • 本地临时表CREATE TABLE #t )仅对创build它的连接可见,并在连接closures时删除。

  • 全局临时表CREATE TABLE ##t )对每个人都是可见的,并且在引用它们的所有连接都closures时被删除。

  • Tempdb永久表USE tempdb CREATE TABLE t )对每个人都是可见的,并在服务器重新启动时被删除。

1.) 本地临时表仅在连接期间存在,或者如果在复合语句中定义,则在复合语句的持续时间内存在。

本地临时表仅适用于创build表的SQL Server会话或连接(表示单个用户)。 当创build表的会话closures时,这些会自动删除。 本地临时表名称使用单个散列(“#”)标记。

 CREATE TABLE #LocalTemp ( UserID int, Name varchar(50), Address varchar(150) ) GO insert into #LocalTemp values ( 1, 'Name','Address'); GO Select * from #LocalTemp 

本地临时表的范围存在于当前用户的当前会话意味着当前查询窗口。 如果您将closures当前的查询窗口或打开一个新的查询窗口,并将尝试查找上面创build的临时表,它会给你错误。


2.) 全局临时表永久保留在数据库中,但行只存在于给定的连接中。 连接closures时,全局临时表中的数据将消失。 但是,下次打开数据库时,表定义将保留在数据库中以供访问。

全局临时表可用于所有SQL Server会话或连接(意味着所有用户)。 这些可以由任何SQL Server连接用户创build,并在所有SQL Server连接closures后自动删除。 全局临时表名称使用双重哈希(“##”)符号。

 CREATE TABLE ##GlobalTemp ( UserID int, Name varchar(50), Address varchar(150) ) GO insert into ##GlobalTemp values ( 1, 'Name','Address'); GO Select * from ##GlobalTemp 

全局临时表对所有SQL Server连接都是可见的,而本地临时表只对当前的SQL Server连接可见。

在线书籍引用:

本地临时表仅在当前会话中可见; 全局临时表对所有会话均可见。

临时表在超出作用域时会自动删除,除非使用DROP TABLE明确删除:

  • 在存储过程中创build的本地临时表将在存储过程完成时自动删除。 该表可以由创build该表的存储过程执行的任何嵌套存储过程引用。 该表不能被称为创build表的存储过程的进程引用。
  • 所有其他本地临时表在当前会话结束时自动删除。
  • 全局临时表会在创build表的会话结束并且所有其他任务停止引用时自动删除。 任务和表之间的关联仅在单个Transact-SQL语句的生命周期中进行维护。 这意味着在创build会话结束时最后一个正在引用表的Transact-SQL语句完成时,会删除全局临时表。