SqlServer入门知识-创建临时表
https://zhuanlan.zhihu.com/p/562721751
平时会直接在正常的库里面直接建表,好像和这个不一样,了解下。平时用时会直接在库里备份数据,然后删掉备份的表。属于数据备份,不是真正的临时表。
一、临时表的介绍
1、临时表与永久表操作相似
2、临时表是存储在tempdb数据库中,当不再使用时会自动删除。
3、临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。
4、真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。
5、不同的数据库连接中,创建的本地临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证本地临时表在数据库连接上的独立性。
6、临时表在事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。
二、本地临时表与全局临时表
1、本地临时表
本地临时表就是用户在创建表的时候添加了“#”前缀的表,其特点是根据数据库连接独立。只有创建本地临时表的数据库连接有表的访问权限,其它连接不能访问该表;
本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接(也就是创建本地临时表的connection)是可见的;当用户从 SQL Server 实例断开连接时被删除。
2、全局临时表
全局临时表的名称以两个数字符号 (##) 打头,创建后对任何数据库连接都是可见的,当所有引用该表的数据库连接从 SQL Server 断开时被删除。
如果使用
BEGIN TRAN
select * from ##Temp with(xlock)
使用事务及排他锁with(xlock): 启动的事务没有被回滚或提交,那么数据库连接2会一直持有临时表##Temp的排他锁,这时Sqlserver会认为还有数据库连接正在引用全局临时表##Temp,所以##Temp不会被释放掉。
直到事务被提交,才会释放。
三、SqlServer 创建临时表
有几种方法:
(#代表局部临时表,如果想创建全局临时表,则将#改为##即可)
1:create table #临时表名(字段1 约束条件,字段2 约束条件,.....) ..)
2、select * into #临时表名 from 真实的列
示例:
select * into #临时表名 from tblCustomer WHERE Type='潜在客户'
select 客户编号,客户名称 into #临时表名 from tblCustomer WHERE Type='潜在客户'
四、查询临时表
select * from #临时表名
五、删除临时表
drop table #临时表名;
可在删除前先判断它是否存在
if object_id('tempdb..#临时表名') is not null
drop table #临时表名;
六、使用临时表的示例
Drop table #tmpCust --删除临时表#tmpCust
create table #tmpCust --创建临时表#tmpCust
(
FId int IDENTITY (1,1) not null, --创建自动递增ID
FCustomCode varchar(50), --客户编码
FCustomName varchar(100), --客户名称
primary key FId) --设置FId为临时表主键
);
select @custName=FCustomName from #tmpCust --查询临时表tmpCust数据 给变量
truncate table #tmpCust --清空临时表tmpCust所有数据和约束