#temptable和## TempTable之间的区别?

时间:2014-01-09 03:48:21

标签: sql-server temp

请解释一下SQL Server中#temptable##TempTable之间的区别。我搜索了这个,但找不到任何答案。

请帮我解决这个问题

7 个答案:

答案 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实例断开连接时将被删除。

Taken from here

More on this

答案 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”。

  • 如果在存储过程中创建了临时表,则为 存储过程完成后自动删除 执行。

  • 您可以使用相同的名称创建本地临时表,但在 不同的连接,并以相同的名称存储 具有各种随机值。

“ ##”表示全局临时表

  • 它以单个哈希值“ ##”作为表的前缀开头 名称,并且名称始终是唯一的。
  • 名称后没有随机数。全局临时 表对SQL Server的所有连接都是可见的。
  • 仅在最后一次连接时销毁全局临时表 引用表已关闭(我们在其中创建了Global 临时表)。
  • 您可以从以下位置的所有连接访问全局临时表 SQL Server,直到打开引用连接。