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

时间:2010-05-27 11:58:28

标签: sql-server temp-tables global-temp-tables

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

7 个答案:

答案 0 :(得分:298)

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

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

  • 每个人都可以看到
  • 全局临时表CREATE TABLE ##t), 当引用它们的所有连接都已关闭时删除。

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

答案 1 :(得分:100)

我发现这个解释非常清楚(它是来自Technet的纯文本):

  

临时表有两种类型:本地和全局。在与SQL Server实例相同的连接期间,本地临时表仅对其创建者可见,就像首次创建或引用表时一样。用户断开与SQL Server实例的连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,并且在引用该表的所有用户与SQL Server实例断开连接时将被删除。

答案 2 :(得分:11)

在线图书引用:

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

临时表在超出范围时会自动删除,除非使用DROP TABLE:

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

答案 3 :(得分:11)

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

  

本地临时表仅适用于SQL Server会话或   创建表的连接(表示单个用户)。这些是   在创建表的会话具有时自动删除   已经关闭。本地临时表名称用单个哈希开始   (&#34;#&#34;)签署。

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

本地临时表的范围存在于当前的当前会话中   user表示当前查询窗口。如果你将关闭当前   查询窗口或打开一个新的查询窗口,并尝试在上面找到   创建临时表,它会给你错误。

2。) 全局临时表永久保留在数据库中,但这些行仅存在于给定连接中。关闭连接时,全局临时表中的数据将消失。但是,下次打开数据库时,表定义仍保留在数据库中以进行访问。

  

全局临时表可用于所有SQL Server会话或   连接(表示所有用户)。这些可以由任何SQL创建   服务器连接用户和所有这些都会自动删除   SQL Server连接已关闭。全球临时表   名称以双哈希(&#34; ##&#34;)符号开始。

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可见   连接。

答案 4 :(得分:1)

我没有看到任何答案向用户显示可以在哪里找到Global Temp表。在SSMS中导航时,可以在同一位置查看本地和全局临时表。下面的屏幕截图取自this link

数据库->系统数据库-> tempdb->临时表

enter image description here

答案 5 :(得分:0)

值得一提的是,还有:database scoped global temporary tables(当前仅由Azure SQL数据库支持)。

  

SQL Server的全局临时表(以##表名开头)存储在tempdb中,并在整个SQL Server实例的所有用户会话中共享。

     

Azure SQL数据库支持全局临时表,这些临时表也存储在tempdb中,范围为数据库级别。这意味着全局临时表在同一Azure SQL数据库中为所有用户的会话共享。 来自其他数据库的用户会话无法访问全局临时表。

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

答案 6 :(得分:0)

本地临时表:如果创建本地临时表,然后打开另一个连接并尝试查询,则会收到以下错误。

临时表只能在创建临时表的会话中访问。

全局临时表: 有时,您可能想创建一个临时表,其他连接可以访问该表。在这种情况下,您可以使用全局临时表。

仅当所有引用临时表的会话关闭时,才会销毁全局临时表。