您的位置:首页 > 数据库

转载:数据库中临时表,表变量和CTE使用优势极其区别

2010-03-25 23:03 323 查看
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的操作中,会有比较多的限制.

代码

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: