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

zhengyingcan 2009-01-07 08:38:13
请教一下临时表的生命周期,有临时表的查询,在短时候内执行第2次,显示临时表已经存在, 当第一次查询完后,要等一段时间,再能执行第2次,才不会显示有错误,那么临时表,并没有随着SQL语句的结束而马上结束
那临时表的生命周期到底是多长
...全文
2697 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
truelove7283159 2010-08-15
  • 打赏
  • 举报
回复
look
ShenLiang2025 2009-01-08
  • 打赏
  • 举报
回复
临时表有两种,局部的和全局的.和普通表的表面上的区别就是 分别以#和##开头.她们是保存在磁盘上的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里面的命令.结果刚才建立的临时表不复存在....






claro 2009-01-07
  • 打赏
  • 举报
回复
帮顶。理解不同,结果也不同。
zhengyingcan 2009-01-07
  • 打赏
  • 举报
回复
创建者是指登入的帐号,还是指创建的IP地址,假如是IP地址,那么还是不可见的.
zhengyingcan 2009-01-07
  • 打赏
  • 举报
回复
SQL Server 实例连接期间,本地临时表只对于创建者是可见的, 我想问一下假如有一百个用户同时用sa的帐号创建,是不是对于这一百个用户来说都是可见的呢,
crazyxf 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wufeng4552 的回复:]
SQL code/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop table #Tmp(或者drop table ##Tmp)来显式删除临时表。
*/

[/Quote]
正解,全局临时表能不用就不用
yuangang1011 2009-01-07
  • 打赏
  • 举报
回复
原来是这样的啊,了解了,以前一直不清楚了,今天学习了,呵呵
jacksonxie 2009-01-07
  • 打赏
  • 举报
回复
Zoezs 2009-01-07
  • 打赏
  • 举报
回复
临时表只在一个会话过程中存在,比如执行一个存储,在执行过程中是有效的,执行完该存储,临时表自动消失。
ws_hgo 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wufeng4552 的回复:]
SQL code/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop table #Tmp(或者drop table ##Tmp)来显式删除临时表。
*/

[/Quote]
这是这个
很详细
昵称被占用了 2009-01-07
  • 打赏
  • 举报
回复
1、如果不显式删除临时表,局部临时表(#开头)的生命周期是产生这个临时表的连接关闭的时候自动删除,全局临时表(#开头)的生命周期是使用过这个临时表的所有连接关闭的时候自动删除。
2、为了不出现临时表已经存在的情况,应该在差生临时表前或者使用临时表后显式删除临时表,使用drop table语句
pl_mm 2009-01-07
  • 打赏
  • 举报
回复
临时表
临时表有两种类型:本地表和全局表。在与首次创建或引用表时相同的 SQL Server 实例连接期间,本地临时表只对于创建者是可见的。当用户与 SQL Server 实例断开连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都是可见的,当引用该表的所有用户都与 SQL Server 实例断开连接后,将删除全局临时表。
水族杰纶 2009-01-07
  • 打赏
  • 举报
回复
/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop table #Tmp(或者drop table ##Tmp)来显式删除临时表。
*/
leisure_cool 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wufeng4552 的回复:]
SQL code/*
1、局部临时表(#开头)只对当前连接有效,当前连接断开时自动删除。
2、全局临时表(##开头)对其它连接也有效,在当前连接和其他访问过它的连接都断开时自动删除。
3、不管局部临时表还是全局临时表,只要连接有访问权限,都可以用drop table #Tmp(或者drop table ##Tmp)来显式删除临时表。
*/

[/Quote]

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

34,692

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧