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

Vig*_*r A 60 sql-server temp

能否请您解释之间的差异#temptable,并##TempTable在SQL Server中.我搜索了这个,但找不到任何答案.

请帮我解决这个问题

小智 17

`#table指的是本地(仅对创建它的用户可见)临时表.

'## table指的是全局(对所有用户都可见)的临时表.


小智 16

#TempTables不仅限于用户或连接本地。它们在创建它的过程以及创建过程产生的所有过程中都是本地的。例如我有以下内容:

Declare @strDynamicSQL as varchar(8000)

Set @strDynamicSQL = 'Select GetDate() As TheDate Into #TheDateTable'
Execute(@strDynamicSQL)

Select *
From #TheDateTable
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

消息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
Run Code Online (Sandbox Code Playgroud)

我没有错误。

在第一个示例中,该Execute语句在生成的过程中发生。由于表是在该进程中创建的,因此返回时该进程将消失。通过此过程,表将“再见”。

在第二个示例中,表是由顶级过程创建的。然后在生成的过程中与之交互。该表可用于处理在其中创建的表以及生成的任何进程。

##tables打破这个。##创建表的过程将是控制过程。如果该进程仍然存在,即使没有针对该进程的任务,也不会将该表标记为要删除。一旦创建了##表的进程消失,则对该表执行最后一个任务时,该表将被标记为要删除。

一种简单的查看方式是,#表仅在创建表的过程的范围内 ##可用。与其他任何表一样,可用表,只是存在与创建表的过程有关。


Sam*_*ack 7

与第一次创建或引用表时,在与SQL Server实例相同的连接期间,本地临时表仅对其创建者可见。用户从SQL Server实例断开连接后,将删除本地临时表。全局临时表对任何用户和创建后的任何连接都是可见的,并且当所有引用该表的用户与SQL Server实例断开连接时,这些临时表将被删除。

从这里取

更多关于这个


goo*_*yui 5

简单的测试方法#localtable and ##globaltable

在不同的 SQL 查询窗口中尝试此操作

create table ##globaltemptable (id int )
go
insert into ##globaltemptable values (1)
go
select * from ##globaltemptable
Run Code Online (Sandbox Code Playgroud)

在不同的 SQL 查询窗口中尝试此操作

create table #localtemptable (id int )
go
insert into #localtemptable values (1)
go
select * from #localtemptable
Run Code Online (Sandbox Code Playgroud)

现在,如果您在全局窗口语法中运行表的选择查询:#localtemptable,您将收到如下错误:-

Invalid object name '#localtemptable'.
Run Code Online (Sandbox Code Playgroud)

当您在同一会话的任何查询窗口中对表:##globaltemptable 运行选择查询时,您将获得查询结果返回。


Sam*_*ain 5

#tempTable ”表示本地临时表

  • 它以单个哈希值“#”作为表名的前缀。

  • 本地临时表仅适用于创建它的连接
    。每个本地临时表的表名末尾都有一个随机值。

  • 当现有连接关闭时,本地临时表会自动删除,或者用户可以使用以下命令“drop table #TempTable”显式删除它。

  • 如果临时表是在存储过程中创建的,那么它会在存储过程执行完成时自动删除。

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

##tempTable ”表示全局临时表

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