请解释一下SQL Server中#temptable
和##TempTable
之间的区别。我搜索了这个,但找不到任何答案。
请帮我解决这个问题
答案 0 :(得分:9)
`#table指的是本地(仅对创建它的用户可见)临时表。'
' ## table指全局(对所有用户都可见)临时表。'
答案 1 :(得分:7)
#TempTables
不仅在用户或连接本地。它们在创建它的过程以及创建过程产生的所有过程中都是本地的。例如,我有以下内容:
Declare @strDynamicSQL as varchar(8000)
Set @strDynamicSQL = 'Select GetDate() As TheDate Into #TheDateTable'
Execute(@strDynamicSQL)
Select *
From #TheDateTable
我收到以下错误:
消息208,级别16,状态0,第7行无效的对象名称 “ #TheDateTable”。
但如果我这样做:
Declare @strDynamicSQL as varchar(8000)
Create Table #TheDateTable (
TheDate DateTime
)
Set @strDynamicSQL = 'Insert Into #TheDateTable Select GetDate() As TheDate'
Execute(@strDynamicSQL)
Select *
From #TheDateTable
我没有错误。
在第一个示例中,Execute
语句在生成的过程中发生。由于表是在该进程中创建的,因此在返回时该进程将消失。通过此过程,表将“再见”。
在第二个示例中,表是由顶级过程创建的。然后在生成的过程中与之交互。该表可用于处理创建该表以及生成的任何进程。
##tables
打破了这一点。创建##
表的过程将成为控制过程。如果该进程仍然存在,即使没有针对该进程的任务,也不会将该表标记为要删除。一旦创建了##表的进程消失,则对该表执行最后一个任务时,该表将被标记为要删除。
一种简单的查看方式是#
表仅在其创建过程的范围内可用。##
与其他表一样可用,除了存在之外是随其创建过程而变化的。
答案 2 :(得分:5)
本地临时表在与SQL Server实例相同的连接期间仅对其创建者可见,就像首次创建或引用表时一样。用户断开与SQL Server实例的连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,并且在引用该表的所有用户与SQL Server实例断开连接时将被删除。
答案 3 :(得分:1)
测试#localtable and ##globaltable
在其他SQL查询窗口中尝试
create table ##globaltemptable (id int )
go
insert into ##globaltemptable values (1)
go
select * from ##globaltemptable
在其他SQL查询窗口中尝试
create table #localtemptable (id int )
go
insert into #localtemptable values (1)
go
select * from #localtemptable
现在,如果以全局窗口语法运行表:#localtemptable的选择查询,则将出现如下错误:-
Invalid object name '#localtemptable'.
在同一会话的任何查询窗口中运行表的选择查询:## globaltemptable时,您将获得查询结果返回。
答案 4 :(得分:0)
#temp 表仅可用于创建它的会话,并在关闭会话时被删除。
## temp 表(全局)可用于所有会话,但是在关闭创建表的会话并关闭所有对其的引用时仍会删除它们。
答案 5 :(得分:0)
该表将一直可见/可用,直到创建它的进程/连接结束,并且仅直到创建它的会话为止。
该表是全局表,在创建它的进程/会话结束之前,所有人都可以使用。
答案 6 :(得分:0)
“#”表示本地临时表
它以单个哈希值“#”作为表名的前缀开始。
本地临时表仅适用于其所在的连接
创建。每个本地临时表的末尾都有一个随机值
表名。
现有的本地临时表会自动删除 连接已关闭,或者用户可以使用 以下命令“放置表#TempTable”。
如果在存储过程中创建了临时表,则为 存储过程完成后自动删除 执行。
您可以使用相同的名称创建本地临时表,但在 不同的连接,并以相同的名称存储 具有各种随机值。
“ ##”表示全局临时表