一、临时表概述
SqlServer临时表有两种:局部临时表、全局临时表。
1、临时表的共同特点:
- 无论会话的数据库上下文如何,临时表都被保存到 tempdb 数据库中;
- 当临时表数据较少时,页被保存到内存中;内存不足时,才持久化临时表的页;
- 判断临时表是否存在:if object_id(‘tempdb..#临时表名‘,‘U‘) N) is not null print ‘存在‘;
2、临时表之间的区别
局部临时表:
临时表名前以#开头,临时表由创建该表的会话所有,为实现不同会话之间同名的临时表相互隔离,SqlServer为表名称添加下划线和唯一的数字后缀以区分不同会话间同名的临时表。即不同会话之间创建的临时表表名虽然我们看到的是一样,但实际上不一样。临时表的可见性与C#、C语言的变量类似,只对调用堆栈中的创建级别和创建级别的内部级别可见,如在存储过程中创建临时表,在存储过程结束后,临时表即被自动销毁。如果临时表在会话的最外层创建临时表,则在会话、批处理和内部级别中的任何地方都有效,直到会话终止时才销毁。 有效期为到创建级别范围内。同一个会话内可以在不同的级别内创建相同名称的局部临时表,但容易在表名解析时导致错误。
全局临时表:
表名以##开头,可以被所有的会话访问,且任何会话均可以删除全局临时表。全局临时表适用于在多个会话之间共享临时数据而不用担心安全问题,全局临时表的有效期为会话期间而不是创建级别,在创建全局临时表的会话结束后,全局临时表不再向新的会话发放锁,而等现有的会话访问完释放完锁后将销毁全局临时表。
3、创建不属于任何会话的全局临时表
该全局临时表由SqlServer维护一个大于0的引用计数器以确保不会被数据库自动删除。
方法:
在master数据库中创建有 sp_前缀、使用 startup 选项标记的特殊存储过程,
例:
use master;
go
if object_id(‘dbo.sp_test‘) is not null
drop proc dbo.sp_test
go
create proc dbo.sp_test
as
create table ##test
(
name varchar(36)
);
go
exec dbo.sp_procoption ‘sp_test‘,‘startup‘,‘true‘;
这样一来,这种临时表的作用就和永久表没有多大区别了。