sql 临时表的使用详解
Sqlserver数据库中的临时表详解
临时表在Sqlserver数据库中,是非常重要的,下面就详细介绍SQL数据库中临时表的特点及其使用,仅供参考。
临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除。临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。
对于临时表有如下几个特点:
- 本地临时表就是用户在创建表的时候添加了“#”前缀的表,其特点是根据数据库连接独立。只有创建本地临时表的数据库连接有表的访问权限,其它连接不能访问该表;
- 不同的数据库连接中,创建的本地临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证本地临时表在数据库连接上的独立性。
- 真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。
- 临时表在事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。
本地临时表
本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接(也就是创建本地临时表的connection)是可见的;当用户从 SQL Server 实例断开连接时被删除。
例如我们在一个数据库连接中用如下语句创建本地临时表#Temp
数据库连接1:

CREATE TABLE #Temp
(
id int,
customer_name nvarchar(50),
age int
)

然后同时启动数据库连接2,执行查询#Temp的操作
数据库连接2:
select * from #Temp
我们来看看数据库连接2的结果是什么?
数据库连接2:

结果显示,数据库连接2找不到表#Temp。这说明#Temp这张临时表,只是对创建它的数据库连接1可见,而对于数据库连接2来说是不可见的。
全局临时表
全局临时表的名称以两个数字符号 (##) 打头,创建后对任何数据库连接都是可见的,当所有引用该表的数据库连接从 SQL Server 断开时被删除。
例如我们在一个数据库连接中用如下语句创建全局临时表##Temp,然后插入三行数据
数据库连接1:

CREATE TABLE ##Temp
(
id int,
customer_name nvarchar(50),
age int
) INSERT INTO ##Temp VALUES(1,'老王',20),(2,'老张',30),(3,'老李',25)

接着我们在数据库连接2中,查询##Temp的数据
数据库连接2:
select * from ##Temp
数据库连接2结果如下
数据库连接2:

可以看到,数据库连接2可以成功访问到数据库连接1创建的全局临时表##Temp,但是如果我们现在关闭数据连接1,然后再执行数据库连接2的##Temp查询语句会发生什么呢?结果如下:
关闭数据库连接1,然后数据库连接2再次执行:
select * from ##Temp

我们发现关闭数据库连接1后,数据库连接2就找不到全局临时表##Temp了。这是因为数据库连接1被关闭后,数据库连接2此时也没有语句正在使用临时表##Temp,所以Sqlserver认为此时已经没有数据库连接在引用全局临时表##Temp了,就将##Temp释放掉了。
接下来,我们尝试在数据库连接2中对全局临时表##Temp持有事务中的排他锁(X锁)后,然后关闭数据库连接1.
数据库连接1:

CREATE TABLE ##Temp
(
id int,
customer_name nvarchar(50),
age int
) INSERT INTO ##Temp VALUES(1,'老王',20),(2,'老张',30),(3,'老李',25)

数据库连接2:
BEGIN TRAN
select * from ##Temp with(xlock)
关闭数据库连接1,然后数据库连接2执行:
select * from ##Temp

结果显示我们尽管关闭了数据库连接1,但是由于数据库连接2在事务中一直持有全局临时表##Temp的排他锁(X锁),所以临时表##Temp并没有随着数据库连接1的关闭而被释放掉,只要数据库连接2中启动的事务没有被回滚或提交,那么数据库连接2会一直持有临时表##Temp的排他锁,这时Sqlserver会认为还有数据库连接正在引用全局临时表##Temp,所以##Temp不会被释放掉。
sql 临时表的使用详解的更多相关文章
- SQL注入攻防入门详解
=============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...
- SQL注入攻防入门详解(2)
SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...
- [转]SQL注入攻防入门详解
原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...
- 【转载】SQL注入攻防入门详解
滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园 首页 博问 闪存 联系 订阅 管理 随笔-58 评论-2028 文章-5 trackbacks-0 站长 ...
- SQL Server表分区详解
原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆 ...
- MS SQL Server 数据库连接字符串详解
MS SQL Server 数据库连接字符串详解 原地址:http://blog.csdn.net/jhhja/article/details/6096565 问题 : 超时时间已到.在从池中获取连接 ...
- SQL Server2012 安装方法详解
SQL Server2012 安装方法详解 - MonkeyBrothers的博客 - CSDN博客 https://blog.csdn.net/monkeybrothers/article/deta ...
- SQL中EXPLAIN命令详解---(转)
MySQL Explain详解 在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQ ...
- MyBatis的SQL语句映射文件详解
SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用 < ...
随机推荐
- PAT甲级 并查集 相关题_C++题解
并查集 PAT (Advanced Level) Practice 并查集 相关题 <算法笔记> 重点摘要 1034 Head of a Gang (30) 1107 Social Clu ...
- Hystrix的介绍(断路、降级)
在大中型分布式系统中,通常系统很多依赖(HTTP,hession,Netty,Dubbo等),如下图: 在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络 ...
- 理解Python函数和方法
什么是函数? 函数是抽象出的一组执行特定功能的重复代码,通俗理解,就是对一些重复的工作进行封装和然后直接调用,避免重复造轮子. Python中的函数如何定义? 使用def关键字,结构如下: def 函 ...
- Java+Tomcat 环境部署
Java+Tomcat 环境部署 下面在Centos7进行安装Java+Tomcat,网上的很多文章,我在部署中都有些问题,下面是我自己总结的一个安装过程! 安装Java环境 首先,我们先到Java官 ...
- shell习题第21题:计算数字的个数
[题目要求] 计算文档a.txt中每一行出现数字的个数并且要计算一下整个文档中一共出现了几个数字 例如a.txt如下: sdhhyh776dbbgbfg dhhdffhhhs556644382 运行结 ...
- 如何在 arm 官网上找到合适的手册
http://infocenter.arm.com/help/advanced/help.jsp 在这里输入合适的版号即可 这样就可以不用去 CSDN 了 100000_0000_00_EN - AR ...
- 数据结构——java实现栈
栈 定义: 栈是一种先进后出的数据结构,我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的栈称为空栈 栈的java代码实现: 基于数组: import org.junit.jupite ...
- [Vue]axios 发出请求的config
这些是用于发出请求的可用配置选项. 只有url是必需的. 如果未指定方法,请求将默认为GET. { // `url`是将用于请求的服务器URL url: '/user', // `method`是发出 ...
- (十)web服务与javaweb结合(1)
一.解决方法 A . 编写一个监听器,在监听器中发布服务 二.案例一 方法A:编写一个监听器,在监听器中发布服务 1. 编写服务接口 package com.shyroke.service; impo ...
- Asp.Net Core 2.0 之旅---@Html.Action
原文:Asp.Net Core 2.0 之旅---@Html.Action 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...