SqlServer临时表

临时表的使用

什么是临时表

临时表分为两种:本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。

本地临时表的名称前面有一个编号符 #table_name,而全局临时表的名称前面有两个编号符 ##table_name

临时表的使用场景

数据二次过滤

数据库中表创建完成之后,对于复杂的查询,可以引入临时表,将数据插入到临时表,然后从临时表查询数据。

在数据库层面缓存数据

建经常使用的数据,插入到临时表,作为缓存使用。

语法

创建临时表

方法一:

create table #临时表名(字段1 约束条件,
                      字段2 约束条件,
                  .....)
create table ##临时表名(字段1 约束条件,
                          字段2 约束条件,
                      .....)

方法二:

select * into #临时表名 from 你的表;
select * into ##临时表名 from 你的表;

注:以上的#代表局部临时表,##代表全局临时表

查询临时表 

select * from #临时表名;
select * from ##临时表名;

删除临时表 

drop table #临时表名;
drop table ##临时表名;

示例

在SQL语句中使用:

drop table #Tmp   --删除临时表#Tmp
create table #Tmp --创建临时表#Tmp
(
    ID   int IDENTITY (1,1)     not null, --创建列ID,并且每次新增一条记录就会加1
    WokNo                varchar(50),
    primary key (ID)      --定义ID为临时表#Tmp的主键
);
Select * from #Tmp    --查询临时表的数据
truncate table #Tmp --清空临时表的所有数据和约束

在存储过程中使用:

Declare @Wokno Varchar(500) --用来记录职工号
Declare @Str NVarchar(4000) --用来存放查询语句
Declare @Count int --求出总记录数
Declare @i int
Set @i = 0
Select @Count = Count(Distinct(Wokno)) from #Tmp
While @i < @Count
    Begin
       Set @Str = ‘Select top 1 @Wokno = WokNo from #Tmp Where id not in (Select top ‘ + Str(@i) + ‘id from #Tmp)‘
       Exec Sp_ExecuteSql @Str,N‘@WokNo Varchar(500) OutPut‘,@WokNo Output
       Select @WokNo,@i --一行一行把职工号显示出来
       Set @i = @i + 1
End

原理

如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 数据库的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名 table_name 不能超过 116 个字符。

除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:

当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。

所有其它本地临时表在当前会话结束时自动除去。

生命周期

全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表。

在存储过程或触发器中创建的本地临时表与在调用存储过程或触发器之前创建的同名临时表不同。如果查询引用临时表,而同时有两个同名的临时表,则不定义针对哪个表解析该查询。嵌套存储过程同样可以创建与调用它的存储过程所创建的临时表同名的临时表。嵌套存储过程中对表名的所有引用都被解释为是针对该嵌套过程所创建的表,例如:

CREATE PROCEDURE Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (2)
SELECT Test2Col = x FROM #t
GO
CREATE PROCEDURE Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (1)
SELECT Test1Col = x FROM #t
EXEC Test2
GO
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (99)
GO
EXEC Test1
GO
下面是结果集:
(1 row(s) affected)

Test1Col
-----------
1          

(1 row(s) affected)

Test2Col
-----------
2

当创建本地或全局临时表时,CREATE TABLE 语法支持除 FOREIGN KEY 约束以外的其它所有约束定义。如果在临时表中指定 FOREIGN KEY 约束,该语句将返回警告信息,指出此约束已被忽略,表仍会创建,但不具有 FOREIGN KEY 约束。在 FOREIGN KEY 约束中不能引用临时表。

小结

表变量和临时表

考虑使用表变量而不使用临时表。当需要在临时表上显式地创建索引时,或多个存储过程或函数需要使用表值时,临时表很有用。通常,表变量提供更有效的查询处理。

时间: 2024-10-06 15:01:11

SqlServer临时表的相关文章

Oracle、SqlServer——临时表

一.概述: oracle数据库的临时表的特点: 临时表默认保存在TEMP中: 表结构一直存在,直到删除:即创建一次,永久使用: 不支持主外键. 可以索引临时表和在临时表基础上建立视图.建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效. 临时表可以拥有触发器. 临时表分为事务型和会话型 会话型:基于会话的临时表,数据从会话开始到会话结束之间是有效的,当会话结束时,表中的数据会自动清空.不同会话之间的数据是隔离的,互不影响. 事务型:基于事务的临时表,其比会话型的临时表更灵活,可以认为是

SqlServer——临时表和表变量

一.临时表概述 SqlServer临时表有两种:局部临时表.全局临时表. 1.临时表的共同特点: 无论会话的数据库上下文如何,临时表都被保存到 tempdb 数据库中: 当临时表数据较少时,页被保存到内存中:内存不足时,才持久化临时表的页: 判断临时表是否存在:if object_id('tempdb..#临时表名','U') N) is not null print '存在'; 2.临时表之间的区别 局部临时表: 临时表名前以#开头,临时表由创建该表的会话所有,为实现不同会话之间同名的临时表相

sqlserver临时表浅谈

临时表分为局部和全局 分别是#开头和##开头#开头的临时表只能在本回话中使用,当回话结束的时候创建的临时表会被删除##开头的临时表可以在所有回话中使用,当sqlserver被重启的时候会被删除 无论是#开头的还是##开头的临时表都存在tempdb数据库中 我们可以通过以下语句测试 create table ##aa( a nvarchar(10)) 打开tempdb我们可以看到我们刚创建的表当我们把回话关闭的时候,刷新tempdb表,我们依然可以看到##aa,当我们把sqlserver服务重启的

sqlserver临时表或表变量代替游标

在很多场合,用临时表或表变量也可以替代游标 临时表用在表没有标识列(int)的情况下. 在表有标识列(int)的情况下可以用表变量,当然也可以用临时表. 利用临时表或表变量的原因时,生成一个连续的列 对于临时表是使用 SELECT .... ,IDENTITY(int) NewID INTO #tmp SELECT ... FROM YourTable 对于YourTable含有标识列(比如字段名为ID)时,可以 INSERT @tmpTable SELECT ..., NewID=(SELEC

SqlServer临时表操作

临时表是建立在系统临时文件夹中的表,如果使用得当,完全可以像普通表一样进行各种操作,在VFP(Visual FoxPro ,是Microsoft公司推出的最新可视化数据库管理系统平台)退出时自动被释放. 可以创建本地和全局临时表.本地临时表仅在当前会话中可见:全局临时表在所有会话中都可见.本地临时表的名称前面有一个编号符 (#),而全局临时表的名称前面有两个编号符 (##). 如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表

Oracle临时表GLOBAL TEMPORARY TABLE

临时表:像普通表一样,有结构,但是对数据的管理上不一样,临时表存储事务或会话的中间结果集,临时表中保存的数据只对当前 会话可见,所有会话都看不到其他会话的数据,即使其他会话提交了,也看不到.临时表不存在并发行为,因为他们对于当前会话都是独立的. 创建临时表时,Oracle只创建了表的结构(在数据字典中定义),并没有初始化内存空间,当某一会话使用临时表时,ORALCE会从当前用户的 临时表空间分配一块内存空间.也就是说只有向临时表中插入数据时,才会给临时表分配存储空间. 临时表分事务级临时表和会话

SQL 笔记 By 华仔

-------------------------------------读书笔记------------------------------- 笔记1-徐 最常用的几种备份方法 笔记2-徐 收缩数据库的大小的方法 笔记3-徐 设置数据库自动增长注意要点 笔记4-徐 模仿灾难发生时还原adventurework数据库 示例 stopat 笔记5-徐 检查日志文件不能被截断的原因 笔记6-徐 检测孤立用户并恢复孤立用户到新的服务器 解决数据库镜像孤立用户问题 笔记7-徐 SQLSERVER日志记录

sqlserver 存储过程中使用临时表到底会不会导致重编译

曾经在网络上看到过,SqlServer的存储过程中使用临时表,会导致执行计划无法重用, 运行时候会导致重编译的这么一个说法,自己私底下去做测试的时候,根据profile的跟踪结果, 如果不是统计信息变更导致导致的重编译,单单是使用临时表,并不会导致重编译, 但是对于一些特殊的情况,又确实会出现重编译的, 为了弄清楚这个问题,查阅了大量的资料,才把这个问题弄清楚,这里特意记录下来,希望武断地认为存储过程中使用了临时表就会导致重编译的这个观点得到纠正. 首先进行下面的测试,我们知道,导致临时表重编译

SqlServer中临时表的使用

http://www.cnblogs.com/chongzi/archive/2011/01/19/1939106.html --存储过程中将多表连接结果写入到临时表中,然后通过游标查询临时表内容 --判断临时表是否存在 IF OBJECT_ID('tempdb..#TmpTable') IS NOT NULL DROP TABLE #TmpTable SELECT a.[a1],a.[a1],b.[b1],b.[b2] INTO #TmpTable FROM A a LEFT JOIN B b