一。临时表介绍
不知道园子里的朋友对SQL 里的临时表(Temporary Table)的概念深不深,应该不会太难。当我们在开发的过程中,临时表给我们带来了特别大的好处。
临时表在运行被创建的,虽说它的名字叫做临时表,可是对它的操作和我们平时操控表的操作一样, 换句话说就是,我们平时怎么操作表,也同样适用在临时表中,比如最简单增、删、改、查等等。
但是,需要注意的是临时表的创建是有范围限制的。
本次文章主要就是为了快速的给初学者一个对临时表的概念,希望不会误人子弟。
二.临时表分类
临时表分为2种,一种是本地临时表,另外一种就是全局临时表。
2.1本地临时表
以一个井号 (#) 开头的那些表名。只有在创建本地临时表的连接上才能看到这些表,链接断开时临时表即被删除(本地临时表为创建它的该链接的会话所独享)或者这样说局部临时表是有当前用户创建的,并且只有当前用户的会话才可以访问。
2.1全局临时表
以两个井号 (##) 开头的那些表名。在所有连接上都能看到全局临时表或者这样说只要这个全局临时表存在,那么用户创建会话后对所有的用户都是可见的。如果在创建全局临时表的 连接断开前没有显式地除去这些表,那么只要所有其它任务停止引用它们,这些表即被除去。当创建全局临时表的连接断开后,新的任务不能再引用它们(换句话说 旧的任务还何以引用)。当前的语句一执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表即被除去。
三。临时表的创建(基于SQL 2005)
3.1 创建本地临时表
代码如下:
Create table #Users( ID int, UserName varchar(50), Password varchar(50), RegisterDate Datetime );
上面这段代码很简单,也很好理解,因为有一个# 所以它表示创建的是本地临时表。
那有些好奇的园友可能会问,那这个临时表创建之后,它被放到哪里了呢?good question,它却是有一个地方存放,它在tempdb表中的Temporary Tables 中,意思很明了 就是“临时”的意思。
比如在我的SQL 2005上面:
画黄色那个就是路径,有一条长长的线条,然后后面跟着数字!~对,你没错 这就是临时表的表名。这个我没有必要过多的担心,我们需要做的仅仅只是表名而已。
临时表的全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的 table_name 不能超过 116 个字符。
OK,表的框架搭建好了,那下一步就需要往里面添加数据了,go on。
添加数据操作:
insert into #Users values(1,'Lan','123456','2011.04.23')
通过“Select * from #Users”语句,执行查询 如下结果:
没骗你吧!
但是,如果你把现在的查询窗口关闭了,在重新打开,然后在在查询里输入,则会进行报错,如图:
提示 #Users无效。
为什么呢?很简单,因为本地临时表只是用在当前用户的当前连接中。所以如果当前的连接退出,会自动销毁自己的表。
3.2创建全局临时表
全局临时表的代码基本和本地临时的代码一致,唯一的区域是,本地临时表的表明前面是一个#,而全局临时表的表名是2个##。
如:
Create Table ##Users( ID int, UserName varchar(50), Password varchar(50) );
很相似吧,简直就是2个双胞胎呢!~呵呵~继续。。
它也存储在老地方----Temporary Tables中,如:
OK 上面2中方式都讲完了,很简单吧!。
四。什么时候用临时表及注意事项
我总结了下,在下面的3个场景中,可以考虑用到临时表:
- 在存储过程中,我们需要对大量数据进行操作
- 这是游标使用的替代的解决方案,我们可以把结果输入到临时表中,然后在在从临时表中抽取我们所需要的数据。
- 有一个复杂的comple操作的时候,也可以考虑用临时表。
注意事项:
- 在SQL Server中,临时表是被创建在Temporary的tempdb中,所以,在一定程度上,它还是会影响数据库执行时候的性能,也就是性能问题。
- 当临时表做完了它的本职工作之后,临时表会自动删除。
五。替代解决方案
当然,用我们上面的方法,未必就是数据的唯一的一种方法,我们还可以有其他的解决方案。
比如我们可以用table variable的方式来创建,如下:
Declare @TempTableVariable TABLE( UserID int, UserName varchar(50), UserAddress varchar(150))
插入:
insert into @TempTableVariable values ( 1, 'Abhijit','India');
等等 基本和上面的一样,就不说了。
祝大家愉快每一天。