临时表的生命周期到底有多长

时间:2022-06-16 09:01:58
请教一下临时表的生命周期,有临时表的查询,在短时候内执行第2次,显示临时表已经存在, 当第一次查询完后,要等一段时间,再能执行第2次,才不会显示有错误,那么临时表,并没有随着SQL语句的结束而马上结束
那临时表的生命周期到底是多长

14 个解决方案

#1


/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。   
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。   
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop   table   #Tmp(或者drop   table   ##Tmp)来显式删除临时表。   
*/
    

#2


临时表
临时表有两种类型:本地表和全局表。在与首次创建或引用表时相同的 SQL Server 实例连接期间,本地临时表只对于创建者是可见的。当用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,当引用该表的所有用户都与 SQL Server 实例断开连接后,将删除全局临时表。

#3


1、如果不显式删除临时表,局部临时表(#开头)的生命周期是产生这个临时表的连接关闭的时候自动删除,全局临时表(#开头)的生命周期是使用过这个临时表的所有连接关闭的时候自动删除。
2、为了不出现临时表已经存在的情况,应该在差生临时表前或者使用临时表后显式删除临时表,使用drop table语句

#4


引用 1 楼 wufeng4552 的回复:
SQL code/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。   
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。   
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop   table   #Tmp(或者drop   table   ##Tmp)来显式删除临时表。   
*/
    

这是这个
很详细

#5


临时表只在一个会话过程中存在,比如执行一个存储,在执行过程中是有效的,执行完该存储,临时表自动消失。

#6


#7


原来是这样的啊,了解了,以前一直不清楚了,今天学习了,呵呵 

#8


引用 1 楼 wufeng4552 的回复:
SQL code/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。   
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。   
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop   table   #Tmp(或者drop   table   ##Tmp)来显式删除临时表。   
*/
    

正解,全局临时表能不用就不用

#9


SQL Server 实例连接期间,本地临时表只对于创建者是可见的,  我想问一下假如有一百个用户同时用sa的帐号创建,是不是对于这一百个用户来说都是可见的呢,

#10


创建者是指登入的帐号,还是指创建的IP地址,假如是IP地址,那么还是不可见的.

#11


帮顶。理解不同,结果也不同。

#12


引用 1 楼 wufeng4552 的回复:
SQL code/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。   
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。   
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop   table   #Tmp(或者drop   table   ##Tmp)来显式删除临时表。   
*/
    


补充点:在Sql 2005中,定义临时表还可以@开头(如:declare @table table(id bigint))

#13


临时表有两种,局部的和全局的.和普通表的表面上的区别就是 分别以#和##开头.她们是保存在磁盘上的tempdb数据库里的
 例子如下:

create table #producttemp
(productno int primary key)


接下来就是临时表的存在范围了.局部临时表(以下简称#表),则在一个procedure和batch里面.如果超出超范围则无效.
 1 下面以例子佐证,创建存储过程如下:
use testshen 
 create/*alter*/ proc prctest
as
select 3
create table #temptest
(id int,
ename varchar(12)
)
insert into #temptest values(1,'test')
select * from #temptest
exec prctest

这时你在SSMS里面输入 
use tempdb
select * from INFORMATION_SCHEMA.TABLES


这时查出的TABLE_NAME 并不是你#temptest.这正是此表仅在proc下有效.

use tempdb
select * from #temptest

返回如下message:
Msg 208, Level 16, State 0, Line 1
Invalid object name '#temptest'.

 2这时你再新建查询 即点击New Query,有同样的命令查询,结果是一样的.因为它更不是在同一个会话下的.
 3 如果你是在tempdb里面直接创建临时表,这时你用
use tempdb
select * from INFORMATION_SCHEMA.TABLES

下的TABLE_NAME去查询该表,它和你创建的表名是一致的.但是如果你执照2步骤,仍然会提示无此对象.
 4 如果是全局临时表,即##table.则3中情况不会出现.即是它的会话期要比#table的广些.
 5 还要补充下,如果你在不同的 查询环境 创建同名的临时表,他们也是不同的表.这就是会话和临时表的含义.想看到不同可以用
 
use tempdb
select * from INFORMATION_SCHEMA.TABLES

查看自己定义的同名的表名
我的结果如下:
#temptest3__________________________________________________________________________________________________________000000000004
#temptest3__________________________________________________________________________________________________________000000000007
记住后面的12位正是标志不同的,所以一个临时表的长度定义最长为116位
 6至于删除等操作,拥有会话权限,在session下就可... 连接(SSMS)是会话,不同用户下也是,新建个查询也是,存储过程亦然....
 7 断开SSMS则局部和全局的临时表均不存在.同样用5里面的命令.结果刚才建立的临时表不复存在....


 
 


#14


look

#1


/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。   
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。   
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop   table   #Tmp(或者drop   table   ##Tmp)来显式删除临时表。   
*/
    

#2


临时表
临时表有两种类型:本地表和全局表。在与首次创建或引用表时相同的 SQL Server 实例连接期间,本地临时表只对于创建者是可见的。当用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,当引用该表的所有用户都与 SQL Server 实例断开连接后,将删除全局临时表。

#3


1、如果不显式删除临时表,局部临时表(#开头)的生命周期是产生这个临时表的连接关闭的时候自动删除,全局临时表(#开头)的生命周期是使用过这个临时表的所有连接关闭的时候自动删除。
2、为了不出现临时表已经存在的情况,应该在差生临时表前或者使用临时表后显式删除临时表,使用drop table语句

#4


引用 1 楼 wufeng4552 的回复:
SQL code/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。   
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。   
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop   table   #Tmp(或者drop   table   ##Tmp)来显式删除临时表。   
*/
    

这是这个
很详细

#5


临时表只在一个会话过程中存在,比如执行一个存储,在执行过程中是有效的,执行完该存储,临时表自动消失。

#6


#7


原来是这样的啊,了解了,以前一直不清楚了,今天学习了,呵呵 

#8


引用 1 楼 wufeng4552 的回复:
SQL code/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。   
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。   
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop   table   #Tmp(或者drop   table   ##Tmp)来显式删除临时表。   
*/
    

正解,全局临时表能不用就不用

#9


SQL Server 实例连接期间,本地临时表只对于创建者是可见的,  我想问一下假如有一百个用户同时用sa的帐号创建,是不是对于这一百个用户来说都是可见的呢,

#10


创建者是指登入的帐号,还是指创建的IP地址,假如是IP地址,那么还是不可见的.

#11


帮顶。理解不同,结果也不同。

#12


引用 1 楼 wufeng4552 的回复:
SQL code/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。   
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。   
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop   table   #Tmp(或者drop   table   ##Tmp)来显式删除临时表。   
*/
    


补充点:在Sql 2005中,定义临时表还可以@开头(如:declare @table table(id bigint))

#13


临时表有两种,局部的和全局的.和普通表的表面上的区别就是 分别以#和##开头.她们是保存在磁盘上的tempdb数据库里的
 例子如下:

create table #producttemp
(productno int primary key)


接下来就是临时表的存在范围了.局部临时表(以下简称#表),则在一个procedure和batch里面.如果超出超范围则无效.
 1 下面以例子佐证,创建存储过程如下:
use testshen 
 create/*alter*/ proc prctest
as
select 3
create table #temptest
(id int,
ename varchar(12)
)
insert into #temptest values(1,'test')
select * from #temptest
exec prctest

这时你在SSMS里面输入 
use tempdb
select * from INFORMATION_SCHEMA.TABLES


这时查出的TABLE_NAME 并不是你#temptest.这正是此表仅在proc下有效.

use tempdb
select * from #temptest

返回如下message:
Msg 208, Level 16, State 0, Line 1
Invalid object name '#temptest'.

 2这时你再新建查询 即点击New Query,有同样的命令查询,结果是一样的.因为它更不是在同一个会话下的.
 3 如果你是在tempdb里面直接创建临时表,这时你用
use tempdb
select * from INFORMATION_SCHEMA.TABLES

下的TABLE_NAME去查询该表,它和你创建的表名是一致的.但是如果你执照2步骤,仍然会提示无此对象.
 4 如果是全局临时表,即##table.则3中情况不会出现.即是它的会话期要比#table的广些.
 5 还要补充下,如果你在不同的 查询环境 创建同名的临时表,他们也是不同的表.这就是会话和临时表的含义.想看到不同可以用
 
use tempdb
select * from INFORMATION_SCHEMA.TABLES

查看自己定义的同名的表名
我的结果如下:
#temptest3__________________________________________________________________________________________________________000000000004
#temptest3__________________________________________________________________________________________________________000000000007
记住后面的12位正是标志不同的,所以一个临时表的长度定义最长为116位
 6至于删除等操作,拥有会话权限,在session下就可... 连接(SSMS)是会话,不同用户下也是,新建个查询也是,存储过程亦然....
 7 断开SSMS则局部和全局的临时表均不存在.同样用5里面的命令.结果刚才建立的临时表不复存在....


 
 


#14


look