是什么在SQL Server中本地和全局临时表之间的区别?
Answer 1:
我觉得这个解释很清楚(这是从纯副本的Technet ):
有两种类型的临时表:本地和全局。 本地临时表相同的连接到SQL Server的实例时首次创建或引用表的过程中只对它们的创造者可见。 局部临时表是从SQL Server实例的用户断开连接后删除。 全局临时表是对任何用户,他们在创建后的任何连接可见,当所有用户都引用从SQL Server实例的表断开被删除。
Answer 2:
表变量 (
DECLARE @t TABLE
)只创建它的连接是可见的,并且当所述批处理或存储过程结束被删除。局部临时表 (
CREATE TABLE #t
)仅显示给创建它的连接,当连接关闭被删除。全局临时表 (
CREATE TABLE ##t
)对所有人都可见,而当那些引用它们的所有连接已经关闭被删除。tempdb的永久表 (
USE tempdb CREATE TABLE t
)对所有人都可见,并重新启动服务器时被删除。
Answer 3:
从联机丛书引用:
本地临时表仅在当前会话中可见; 全局临时表对所有会话可见。
当他们走出去的范围的临时表被自动删除,除非使用DROP TABLE显式删除:
- 在存储过程完成时,在存储过程中创建的本地临时表被自动删除。 该表可以由创建该表存储过程执行的任何嵌套的存储过程中被引用。 表不能由称为创建该表的存储过程的过程中被引用。
- 所有其它本地临时表在当前会话结束时自动删除。
- 当创建该表的会话结束全局临时表会自动下降,其他所有任务停止对其引用。 任务与表之间的关联仅保持一个Transact-SQL语句的生活。 这意味着全局临时表在该积极引用该表时,创建会话结束了最后的Transact-SQL语句的结束下降。
Answer 4:
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连接可见。
Answer 5:
值得一提的是,也有: 数据库范围的全局临时表 (目前仅通过Azure的SQL数据库支持)。
对于SQL Server(与##表的名字开始)全局临时表存储在tempdb数据库和所有用户在整个SQL Server实例的会话之间共享。
Azure的SQL数据库支持,它们也存储在tempdb中,而且仅限于数据库级别全局临时表。 这意味着,全局临时表的所有用户同一个SQL Azure的数据库中的会话共享。 从其它数据库的用户会话不能访问全局临时表。
-- 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'