SQL Server中的本地和全局临时表有什么区别?
答案 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:
显式删除答案 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->临时表
答案 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)
本地临时表:如果创建本地临时表,然后打开另一个连接并尝试查询,则会收到以下错误。
临时表只能在创建临时表的会话中访问。
全局临时表: 有时,您可能想创建一个临时表,其他连接可以访问该表。在这种情况下,您可以使用全局临时表。
仅当所有引用临时表的会话关闭时,才会销毁全局临时表。