#temptable
和##TempTable
SQL Server之间有什么区别?
#temptable
和##TempTable
SQL Server之间有什么区别?
Answers:
#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
打破这个。##
创建表的过程将是控制过程。如果该进程仍然存在,即使没有针对该进程的任务,也不会将该表标记为要删除。一旦##
创建表的进程消失了,则对该表执行最后一个任务时,该表将被标记为要删除。
这是一种简单的查看方法。 #
表仅在其创建过程的范围内 ##
可用。除其他存在与创建表的过程一同存在外,其他任何表都可用。
简单的测试方法 #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的选择查询时,您将获得返回查询结果的信息。
“#”表示本地临时表
它以单个哈希值“#”作为表名的前缀开始。
本地临时表仅适用于
创建它的连接。每个本地临时表在表名的末尾都有一个随机值。
当关闭现有连接时,本地临时表将自动删除,或者用户可以使用以下命令“ drop table #TempTable”显式删除它。
如果在存储过程中创建了临时表,则在存储过程执行完成时会自动将其删除。
您可以创建具有相同名称但在不同连接中的本地临时表,并将其与相同的名称以及各种随机值一起存储。
“ ##”表示全局临时表