能否请您解释之间的差异#temptable
,并##TempTable
在SQL Server中.我搜索了这个,但找不到任何答案.
请帮我解决这个问题
小智 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
打破这个。##
创建表的过程将是控制过程。如果该进程仍然存在,即使没有针对该进程的任务,也不会将该表标记为要删除。一旦创建了##表的进程消失,则对该表执行最后一个任务时,该表将被标记为要删除。
一种简单的查看方式是,#
表仅在创建表的过程的范围内 ##
可用。与其他任何表一样,可用表,只是存在与创建表的过程有关。
简单的测试方法#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 运行选择查询时,您将获得查询结果返回。
“ #tempTable ”表示本地临时表
它以单个哈希值“#”作为表名的前缀。
本地临时表仅适用于创建它的连接
。每个本地临时表的表名末尾都有一个随机值。
当现有连接关闭时,本地临时表会自动删除,或者用户可以使用以下命令“drop table #TempTable”显式删除它。
如果临时表是在存储过程中创建的,那么它会在存储过程执行完成时自动删除。
您可以在不同的连接中创建具有相同名称的本地临时表,并且它以相同的名称和各种随机值存储。
“ ##tempTable ”表示全局临时表
归档时间: |
|
查看次数: |
62202 次 |
最近记录: |