当前位置: 首页 > news >正文

SQLSERVER临时表

在 SQL Server 中,临时表(Temporary Table) 是一种用于临时存储数据的特殊表,主要用于存储中间结果、简化复杂查询或在会话 / 存储过程中暂存数据。临时表存储在系统数据库 tempdb 中,会在特定条件下(如会话结束、服务器重启)自动删除,无需手动清理。

一、临时表的类型

根据可见性和生命周期,临时表分为两种:

1. 本地临时表(Local Temporary Table)
  • 标识:表名以 # 开头(如 #TempStudents)。

  • 可见性:仅在创建它的当前会话(Session)中可见,其他会话无法访问。

  • 生命周期:创建它的会话结束(如关闭查询窗口、断开连接)后,自动删除。

  • 适用场景:单个会话内的临时数据处理(如存储过程内部的中间结果)。

2. 全局临时表(Global Temporary Table)
  • 标识:表名以 ## 开头(如 ##GlobalTemp)。

  • 可见性:所有会话都可访问(只要知道表名)。

  • 生命周期:当所有引用它的会话都结束后,自动删除(即使创建它的会话已结束,只要有其他会话在使用,就会保留)。

  • 适用场景:需要在多个会话间共享临时数据(如多用户协作处理同一批临时数据)。

二、临时表的基本操作

临时表的操作语法与普通表类似,支持 CREATEINSERTSELECTUPDATEDELETEDROP 等操作。

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;

三、临时表的特点与适用场景

特点:
  1. 存储位置:所有临时表都存储在 tempdb 数据库中,可通过 SELECT * FROM tempdb.sys.tables 查看。

  2. 会话隔离:本地临时表仅当前会话可见,避免多用户冲突;全局临时表可跨会话共享。

  3. 自动清理:无需手动维护生命周期,系统会自动删除。

  4. 支持索引:可像普通表一样为临时表创建索引,提升查询性能:

    -- 为临时表创建索引
    CREATE INDEX IX_TempStudents_Age ON #TempStudents (Age);
  5. 事务支持:临时表的操作支持事务(BEGIN TRANSACTIONCOMMIT 等)。

适用场景:
  1. 存储复杂查询的中间结果:例如多步计算的报表生成,先将中间结果存入临时表,再逐步处理。

  2. 简化嵌套查询:将多层嵌套的子查询拆分为临时表操作,提高可读性和性能。

  3. 存储过程中的临时数据:在存储过程中暂存数据,避免重复查询底层表。

  4. 多会话共享临时数据:通过全局临时表实现不同会话间的数据传递(如多用户协作场景)。

四、注意事项

  1. tempdb 资源占用:临时表存储在 tempdb 中,大量或大数据量的临时表可能导致 tempdb 空间不足,影响数据库性能。建议及时清理不再使用的临时表。

  2. 本地临时表的作用域

    • 本地临时表在存储过程中创建时,仅在该存储过程内可见,存储过程执行结束后自动删除(即使调用它的会话仍在运行)。

    • 嵌套存储过程中,内层存储过程无法访问外层创建的本地临时表(除非通过参数传递)。

  3. 全局临时表的并发问题:多个会话可同时修改全局临时表,需注意加锁或事务控制,避免数据冲突。

  4. 与表变量的区别

    • 表变量(DECLARE @TableVar TABLE (...))也用于临时存储,但通常适用于小数据集(内存中处理),不支持索引(除主键外),性能在大数据量下不如临时表。

    • 临时表适合大数据量场景,支持索引和统计信息,性能更优。

总结

临时表是 SQL Server 中处理临时数据的重要工具,通过 #(本地)和 ##(全局)区分,适用于存储中间结果、简化查询或跨会话共享数据。使用时需注意 tempdb 资源占用和会话隔离特性,根据数据量大小和共享需求选择本地 / 全局临时表或表变量。

http://www.dtcms.com/a/365799.html

相关文章:

  • 关于专业化与多元化该怎么选?
  • 解决MQ访问不了或者登录不成功问题
  • 卷积神经网络CNN-part2-简单的CNN
  • TypeScript与JavaScript:从动态少年到稳重青年的成长之路
  • RabbitMQ相关知识
  • HTML第七课:发展史
  • Unity:XML笔记(二)——Xml序列化、反序列化、IXmlSerializable接口
  • 裸机程序(1)
  • 【ARM嵌入式汇编基础】-数据处理指令(三)
  • 低成本低功耗认证芯片推荐——LCS4110R
  • 【Luogu】P2398 GCD SUM (容斥原理求gcd为k的数对个数)
  • 鸿蒙NEXT开发实战:图片显示、几何图形与自定义绘制详解
  • GPT4o 提示词 结合 NanoBanbana 会摩擦出什么火花呢?
  • FPGA笔试面试常考问题及答案汇总
  • 入行FPGA选择国企、私企还是外企?
  • 案例演示 切片器悬浮永驻 Power BI VS QuickBI ,不得不说,两个极端了
  • 华勤内推码
  • 智慧交通管理信号灯通信4G工业路由器应用
  • 【机器学习深度学习】LLM:在检索与重排序中的适用场景
  • PS更改图像尺寸
  • 心路历程-初识Linux用户
  • 于海斌、王耀南、张钹三位院士解读具身智能
  • 数据结构与算法-线性表
  • C++零基础第一天:从Hello World到变量常量
  • 【JAVA】windows本地跑zookeeper,然后使用代码连接服务获取znode数据
  • 什么是STDIO 模式,fastmcp 采用 STDIO
  • 基于Java的瑜伽馆管理系统的设计与实现(代码+数据库+LW)
  • 学生党/租房党必看!哈趣三款百元投影仪哪款最香?
  • 在word中使用lateX公式的方法
  • FPGA学习笔记——SDR SDRAM简介