SQL Server中的本地和全局临时表有什么区别?
SQL Server中的本地和全局临时表有什么区别?
Answers:
我发现这个解释很清楚(它是Technet的纯副本):
临时表有两种类型:本地和全局。与第一次创建或引用表时,在与SQL Server实例相同的连接期间,本地临时表仅对其创建者可见。用户从SQL Server实例断开连接后,将删除本地临时表。全局临时表对任何用户和创建后的任何连接都是可见的,并且在引用该表的所有用户与SQL Server实例断开连接时,它们都会被删除。
表变量(DECLARE @t TABLE
)仅对创建它的连接可见,并且在批处理或存储过程结束时将其删除。
本地临时表(CREATE TABLE #t
)仅对创建它的连接可见,并在关闭连接时被删除。
全局临时表(CREATE TABLE ##t
)对所有人都是可见的,并且在引用它们的所有连接都关闭时将其删除。
Tempdb永久表(USE tempdb CREATE TABLE t
)对所有人都是可见的,并且在服务器重新启动时将被删除。
1.) 本地临时表仅在连接期间存在,或者,如果在复合语句中定义,则在复合语句期间存在。
本地临时表仅可用于创建表的SQL Server会话或连接(表示单个用户)。当创建表的会话关闭时,这些将自动删除。本地临时表名称以单个哈希(“#”)符号开头。
CREATE TABLE #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp
本地临时表的范围存在于当前用户的当前会话意味着当前查询窗口。如果您将关闭当前查询窗口或打开一个新的查询窗口,并尝试在上面创建的临时表中查找,则会出现错误。
2.) 全局临时表永久保留在数据库中,但是行仅存在于给定的连接中。关闭连接后,全局临时表中的数据消失。但是,表定义保留在数据库中,以便下次打开数据库时进行访问。
全局临时表可用于所有SQL Server会话或连接(意味着所有用户)。这些可以由任何SQL Server连接用户创建,并且在所有SQL Server连接都关闭后会自动将其删除。全局临时表名称以双哈希(“ ##”)符号开头。
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明确删除了它们:
本地临时表:如果创建本地临时表,然后打开另一个连接并尝试查询,则会收到以下错误。
临时表只能在创建它们的会话中访问。
全局临时表:有时,您可能想创建一个可通过其他连接访问的临时表。在这种情况下,您可以使用全局临时表。
仅当所有引用临时表的会话关闭时,才会销毁全局临时表。
值得一提的是:数据库范围的全局临时表(当前仅由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'
GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }
适用于:Azure SQL数据库(功能已在公共预览版中)
允许设置全局临时表的自动删除功能。缺省值为ON,这意味着在任何会话不使用全局临时表时,它们都会自动删除。设置为OFF时,需要使用DROP TABLE语句显式删除全局临时表,或者在服务器重新启动时将其自动删除。
使用Azure SQL数据库单个数据库和弹性池,可以在SQL数据库服务器的各个用户数据库中设置此选项。在SQL Server和Azure SQL数据库托管实例中,此选项在TempDB中设置,单个用户数据库的设置无效。