1 |
在写SQL时经常会用到临时表,表变量和CTE,这三者在使用时各有优势: |
1. 临时表:分为局部临时表和全局临时表.
1.1局部临时表,创建时以#开头,在系统数据库tempdb中存储. 在当前的链接可见,链接断开则临时表就自动被释放,也可以手动drop table #tmptable
在使用不同的链接同时创建相同的临时表时,互不影响,系统在tempdb中会自动附加以特定的session为标识的名字来区分. 常常在SP中使用,把需要操作的数据或者共同的数据取出放在临时表中,后续可以进行其他的操作(SELECT,UPDATE,DELETE,DROP等).
可以像创建永久表一样创建临时表:
CREATE TABLE#tmpTable
(
IDINT,
NAMEVARCHAR(10),
COMPANYVARCHAR(50)
)
SELECT*FROM#tmpTableJOIN...
DROPTABLE#tmpTable
也可以使用INTO创建临时表,如查询EmployeeID=1的所有订单,放在临时表中,以备后续的处理.
SELECTE.EmployeeID,E.FirstName,E.LastName,O.OrderID,O.CustomerID,O.OrderDate
INTO#tmpTable
FROMOrders OJOINEmployees EONO.EmployeeID=E.EmployeeID
WHEREE.EmployeeID=1
1.2全局临时表,创建时以##开头. 在tempdb中存储,对所有的session都可见.
CREATETABLE##tmpTable2
(
IDINT,
NAMEVARCHAR(20),
COMPANYVARCHAR(50)
)
SELECT*FROM##tmpTable2JOIN...
DROPTABLE##tmpTable2
2.表变量:在内存中存储,比临时表执行速度快. 在SP或者function越过有效scope之后会自动释放,不用显式的写drop.表变量只可用在DML的操作中,会有比较多的限制.

--直接声明表变量
DECLARE@varTableTABLE
(
IDINT,
NAMEVARCHAR(20),
COMPANYVARCHAR(50)
)
--先创建表类型
CREATETYPE[dbo].[T_TEMP]ASTABLE(
IDINT,
NAMEVARCHAR(20),
COMPANYVARCHAR(50)
)
--在声明表变量
DECLARE@varTableT_TEMP
3.CTE(Common Table Expressions)通用表表达:是一个可以由定义语句引用的临时命名的结果集,在它们的简单形式中,可将 CTE 视为类似于非持续性类型视图的派生表.只须定义 CTE 一次,即可在查询中多次引用.

WITHCTE_NAME
AS
(
SELECTE.EmployeeID,E.FirstName,E.LastName,O.OrderID,O.CustomerID,O.OrderDate
FROMOrders OJOINEmployees EONO.EmployeeID=E.EmployeeID
WHEREE.EmployeeID=1
)
SELECT*FROMCTE_NAME
CTE最强大之处在于递归查询,如要仔细研究可以参考微软的文章.
http://space.itpub.net/16436858/viewspace-629908
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器