天天看点

数据库中暂时表,表变量和CTE使用优势极其差别

1

在写SQL时常常会用到暂时表,表变量和CTE,这三者在使用时各有优势:

1. 暂时表:分为局部暂时表和全局暂时表.

  1.1局部暂时表,创建时以#开头,在系统数据库tempdb中存储. 在当前的链接可见,链接断开则暂时表就自己主动被释放,也能够手动drop table #tmptable

在使用不同的链接同一时候创建同样的暂时表时,互不影响,系统在tempdb中会自己主动附加以特定的session为标识的名字来区分. 经常在SP中使用,把须要操作的数据或者共同的数据取出放在暂时表中,兴许能够进行其它的操作(SELECT,UPDATE,DELETE,DROP等).

 能够像创建永久表一样创建暂时表:

CREATE TABLE #tmpTable

(

ID INT,

NAME VARCHAR(10),

COMPANY VARCHAR(50)

)

SELECT * FROM #tmpTable JOIN ...

DROP TABLE #tmpTable

也能够使用INTO创建暂时表,如查询EmployeeID=1的全部订单,放在暂时表中,以备兴许的处理.

SELECT E.EmployeeID,E.FirstName,E.LastName,O.OrderID,O.CustomerID,O.OrderDate

INTO #tmpTable

FROM Orders O JOIN Employees E ON O.EmployeeID=E.EmployeeID

WHERE E.EmployeeID=1

 1.2全局暂时表,创建时以##开头. 在tempdb中存储,对全部的session都可见.

CREATE TABLE ##tmpTable2

NAME VARCHAR(20),

SELECT * FROM ##tmpTable2 JOIN ...

DROP TABLE ##tmpTable2

2.表变量:在内存中存储,比暂时表运行速度快. 在SP或者function越过有效scope之后会自己主动释放,不用显式的写drop.表变量仅仅可用在DML的操作中,会有比較多的限制.

--直接声明表变量

DECLARE @varTable TABLE

--先创建表类型

CREATE TYPE [dbo].[T_TEMP] AS TABLE(

--在声明表变量

DECLARE @varTable T_TEMP

WITH CTE_NAME

AS

SELECT * FROM CTE_NAME