SQLSERVER临时表
在 SQL Server 中,临时表(Temporary Table) 是一种用于临时存储数据的特殊表,主要用于存储中间结果、简化复杂查询或在会话 / 存储过程中暂存数据。临时表存储在系统数据库 tempdb
中,会在特定条件下(如会话结束、服务器重启)自动删除,无需手动清理。
一、临时表的类型
根据可见性和生命周期,临时表分为两种:
1. 本地临时表(Local Temporary Table)
标识:表名以
#
开头(如#TempStudents
)。可见性:仅在创建它的当前会话(Session)中可见,其他会话无法访问。
生命周期:创建它的会话结束(如关闭查询窗口、断开连接)后,自动删除。
适用场景:单个会话内的临时数据处理(如存储过程内部的中间结果)。
2. 全局临时表(Global Temporary Table)
标识:表名以
##
开头(如##GlobalTemp
)。可见性:所有会话都可访问(只要知道表名)。
生命周期:当所有引用它的会话都结束后,自动删除(即使创建它的会话已结束,只要有其他会话在使用,就会保留)。
适用场景:需要在多个会话间共享临时数据(如多用户协作处理同一批临时数据)。
二、临时表的基本操作
临时表的操作语法与普通表类似,支持 CREATE
、INSERT
、SELECT
、UPDATE
、DELETE
、DROP
等操作。
1. 创建临时表
方法 1:使用 CREATE TABLE
显式创建
-- 创建本地临时表 CREATE TABLE #TempStudents (ID INT,Name VARCHAR(50),Age INT,Gender CHAR(1) ); -- 创建全局临时表 CREATE TABLE ##GlobalTempScores (StudentID INT,Subject VARCHAR(50),Score DECIMAL(5,2) );
方法 2:通过 SELECT INTO
快速创建(从查询结果生成临时表)
-- 从现有表查询结果创建本地临时表(自动匹配列名和类型) SELECT ID, Name, Age INTO #TempAdults -- 临时表会自动创建 FROM Students WHERE Age >= 18; -- 同理可创建全局临时表 SELECT StudentID, AVG(Score) AS AvgScore INTO ##GlobalAvgScores FROM Scores GROUP BY StudentID;
2. 插入数据
-- 向本地临时表插入数据 INSERT INTO #TempStudents (ID, Name, Age, Gender) VALUES (1, '张三', 20, '男'),(2, '李四', 22, '女'); -- 向全局临时表插入数据 INSERT INTO ##GlobalTempScores (StudentID, Subject, Score) SELECT ID, '数学', 90 FROM Students WHERE Class = '一班';
3. 查询数据
-- 查询本地临时表 SELECT * FROM #TempStudents WHERE Age > 20; -- 查询全局临时表 SELECT * FROM ##GlobalTempScores WHERE Score >= 85;
4. 修改和删除数据
-- 更新临时表数据 UPDATE #TempStudents SET Age = 21 WHERE Name = '张三'; -- 删除临时表数据 DELETE FROM ##GlobalTempScores WHERE Subject = '体育';
5. 手动删除临时表
虽然临时表会自动删除,但在不需要时手动删除可释放 tempdb
资源:
-- 删除本地临时表 DROP TABLE IF EXISTS #TempStudents; -- 删除全局临时表 DROP TABLE IF EXISTS ##GlobalTempScores;
三、临时表的特点与适用场景
特点:
存储位置:所有临时表都存储在
tempdb
数据库中,可通过SELECT * FROM tempdb.sys.tables
查看。会话隔离:本地临时表仅当前会话可见,避免多用户冲突;全局临时表可跨会话共享。
自动清理:无需手动维护生命周期,系统会自动删除。
支持索引:可像普通表一样为临时表创建索引,提升查询性能:
-- 为临时表创建索引 CREATE INDEX IX_TempStudents_Age ON #TempStudents (Age);
事务支持:临时表的操作支持事务(
BEGIN TRANSACTION
、COMMIT
等)。
适用场景:
存储复杂查询的中间结果:例如多步计算的报表生成,先将中间结果存入临时表,再逐步处理。
简化嵌套查询:将多层嵌套的子查询拆分为临时表操作,提高可读性和性能。
存储过程中的临时数据:在存储过程中暂存数据,避免重复查询底层表。
多会话共享临时数据:通过全局临时表实现不同会话间的数据传递(如多用户协作场景)。
四、注意事项
tempdb
资源占用:临时表存储在tempdb
中,大量或大数据量的临时表可能导致tempdb
空间不足,影响数据库性能。建议及时清理不再使用的临时表。本地临时表的作用域:
本地临时表在存储过程中创建时,仅在该存储过程内可见,存储过程执行结束后自动删除(即使调用它的会话仍在运行)。
嵌套存储过程中,内层存储过程无法访问外层创建的本地临时表(除非通过参数传递)。
全局临时表的并发问题:多个会话可同时修改全局临时表,需注意加锁或事务控制,避免数据冲突。
与表变量的区别:
表变量(
DECLARE @TableVar TABLE (...)
)也用于临时存储,但通常适用于小数据集(内存中处理),不支持索引(除主键外),性能在大数据量下不如临时表。临时表适合大数据量场景,支持索引和统计信息,性能更优。
总结
临时表是 SQL Server 中处理临时数据的重要工具,通过 #
(本地)和 ##
(全局)区分,适用于存储中间结果、简化查询或跨会话共享数据。使用时需注意 tempdb
资源占用和会话隔离特性,根据数据量大小和共享需求选择本地 / 全局临时表或表变量。