您的位置:首页 > 数据库

运用sql语句创建临时表

2014-04-10 13:57 211 查看
Access不支持临时表

首先我们来熟悉下临时表的概念:

临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。

临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个

数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实

例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任

何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。

例如,如果创建了 employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。如果数据库会话创建了本地临时表 #employees,则仅会话可以使用该表,会话断开连接后就将该表删除。如果创建了 ##employees 全局临时表,则数据库中的任何用户均可使用该表。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果您创建该表后另一个用户在使用该表,则 SQL Server 将在您断开连接并且所有其他会话不再使用该表时将其删除。

conn.Execute("SELECT newscomment_user_id AS user_id, COUNT(*) AS counter INTO #userNewsComment1 " _

& " FROM newsComment GROUP BY newscomment_user_id ")

'把从newsComment中或的数据集合写入到临时表 #userNewsComment1 中

'newsComment是新闻评价表

Set rs = conn.Execute("SELECT TOP 10 a.user_id AS trueId, * FROM userInfo AS a INNER JOIN userPoint AS b " _

& " ON a.user_id = b.user_id INNER JOIN View_Company AS c ON a.user_id = c.user_id " _

& " LEFT OUTER JOIN #userNewsComment1 AS d ON d.user_id = a.user_id " _

& " WHERE user_isProvinceNewsShow = 1 " _

& placeCondition & " ORDER BY d.counter DESC ")

conn.execute("drop table #userNewsComment1")

'使用完记住删除临时表,这里是删除临时表对象

这里是把临时表运用上

1、临时表就是用户在创建表的时候添加了“#”前缀的表,其特点是根据进程独立。只有进程的拥有者有表的访问权限,其它用户不能访问该表;

2、不同的用户进程,创建的临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证临时表的进程独立性。

3、定单和购买意向一般不会保存在真正的“临时表”中,而是实际的普通表,之所以称之为“临时表”,只是一种叫法而已。因为随着一个用户进程的结束,真正的临时表会自动清除,而定单和购买意向数据一般是定时清除,所以一定是保存在普通表中,具备数据的持久性特征(临时表最缺乏的就是数据的持久性)。

4、真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。

事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。

数据当前会话期可见,其它的会话只能看到其结构,只能看到自己的数据,各会话的数据互不干扰。

如静态创建临时表t_tmp(a number primary key,b number)

用户A可以有数据 用户B可以有数据

1 2 1 2

2 3 3 4

3 4 6 7

4 5

A)select count(*) from t_emp; 结果为4(B的数据它看不到)

B)select count(*) from t_emp; 结果为3(A的数据它看不到)

它们有相同的两条记录,但由于数据只作用于当前会话期,所以primary key不会限制它们,只限制当前用户下的A唯一主键。

上述互不干扰特性可以用于处理中间计算过程,如果是常规表在同一时间仅能被一个会话操作,锁定资源拒绝被其它会话访问。

.Net中使用局部临时表提示'对象名无效'错误原因:

1.临时表在tempdb数据库中,而且为了多用户时防止冲突,SQL会自动在局部临时表名后面加上一些字符,所以要用下面的方法判断临时表是否存在

if objectproperty(object_id('tempdb..#Temp_Month'),'Isusertable')=1 drop table #Temp_Month

2.切记局部临时表在创建它的过程结束后,也就结束了,只在创建他的会话中有效,所以导致分开执行Sql时临时表不可用

正确方法(例):

exec('CREATE TABLE [#Temp_Month] ([date] datetime null,[week] int null) ON [PRIMARY]

select * from [#Temp_Month]

')



exec('select * into #Temp_Month from S_Menu

select * from [#Temp_Month]

')

原文:http://hi.baidu.com/zhang87224088/item/56787e3f7e317480b711db94
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: