[导入]SQL中的临时表和表变量
生活随笔
收集整理的這篇文章主要介紹了
[导入]SQL中的临时表和表变量
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們經(jīng)常使用臨時(shí)表和表變量,那現(xiàn)在我們就對(duì)臨時(shí)表和表變量進(jìn)行一下討論.
臨時(shí)表局部臨時(shí)表
全局臨時(shí)表
表變量
??????????????????????????????
臨時(shí)表
臨 時(shí)表存儲(chǔ)在TempDB數(shù)據(jù)庫(kù)中,所有的使用此SQL?Server?實(shí)例的用戶都共享這個(gè)TempDB,因?yàn)槲覀儜?yīng)該確保用來存儲(chǔ)TempDB數(shù)據(jù)庫(kù)的 硬盤有足夠的空間,以使之能夠自己的增長(zhǎng).最好能夠存儲(chǔ)在一個(gè)擁有獨(dú)立硬盤控制器上.因?yàn)檫@樣不存在和其它的硬盤I/O進(jìn)行爭(zhēng)用.
?
我 們很多程序員認(rèn)為臨時(shí)表非常危險(xiǎn),因?yàn)榕R時(shí)表有可能被多個(gè)連接所共享.其實(shí)在SQL?Server中存在兩種臨時(shí)表:局部臨時(shí)表和全局臨時(shí)表,局部臨時(shí)表 (Local?temp?table)以#前綴來標(biāo)識(shí),并且只能被創(chuàng)建它的連接所使用.全局臨時(shí)表(Global?temp?table)以##前綴來進(jìn) 行標(biāo)識(shí),并且可以和其它連接所共享.
?
局部臨時(shí)表
局部臨時(shí)表不能夠被其它連接所共享的原因其實(shí)是在SQL?Server?2000中自動(dòng)為局部臨時(shí)表的表名后面加上了一個(gè)唯一字符來標(biāo)識(shí).如:?
?????CREATE?TABLE?[#DimCustomer_test]
?????(
????????[CustomerKey]?[int]
????????,???[FirstName]?[nvarchar](50)??
????,[MiddleName]?[nvarchar](50)??
????,[LastName]?[nvarchar](50)?
????????)
現(xiàn)在我們來查看一下TempDB中?sysobjects表,我們會(huì)發(fā)現(xiàn)我們新創(chuàng)建的臨時(shí)表#DimCustomer_test已經(jīng)被加上了后綴:
?
??USE?TempDB
??GO
??SELECT?name?FROM?sysobjects?WHERE?name?LIKE?’%DimCustomer%’
?
the?Result?is:
name
#DimCustomer_test___________________________________________________________________________________________________000000000005
全局臨時(shí)表
下面我們來看一下全局臨時(shí)表:
?????CREATE?TABLE?[##DimCustomer_test]
?????(
????????[CustomerKey]?[int]
????????,??????[FirstName]?[nvarchar](50)??
????,[MiddleName]?[nvarchar](50)??
????,[LastName]?[nvarchar](50)?
????????)
現(xiàn)在我們來查看一下TempDB中?sysobjects表,我們會(huì)發(fā)現(xiàn)我們新創(chuàng)建的臨時(shí)表##DimCustomer_test沒有被加上了后綴:
?
??USE?TempDB
??GO
??SELECT?name?FROM?sysobjects?WHERE?name?LIKE?’%DimCustomer%’
?
The?Result?are:
#DimCustomer_test___________________________________________________________________________________________________000000000005
##DimCustomer_test
?
--Drop?test?temp?tables
??????????????????????????????DROP?TABLE?[##DimCustomer_test]
??????????????????????????????DROP?TABLE?[#DimCustomer_test]
?
可以看到我們剛才創(chuàng)建的全局臨時(shí)表名字并沒有被加上標(biāo)識(shí).
?
表變量
表變量和臨時(shí)表針對(duì)我們使用人員來說并沒有什么不同,但是在存儲(chǔ)方面來說,他們是不同的,表變量存儲(chǔ)在內(nèi)存中.所以在性能上和臨時(shí)表相比會(huì)更好些!
?
另一個(gè)不同的地方是在表連接中使用表變量時(shí),要為此表變量指定別名.如:
?
??USE?AdventureWorksDW
??GO
??DECLARE?@DimCustomer_test?TABLE?
??(
?????[CustomerKey]?[int]
?????,??????[FirstName]?[nvarchar](50)??
?,[MiddleName]?[nvarchar](50)??
?,[LastName]?[nvarchar](50)?
?????)
??---insert?data?to?@DimCustomer_test
??INSERT?@DimCustomer_test?
??(
?????[CustomerKey]??
?????,??????[FirstName]??
?,[MiddleName]??
?,[LastName]?
?????)
??SELECT??
?????[CustomerKey]??
?????,??????[FirstName]??
?,[MiddleName]??
?,[LastName]?
??FROM?DimCustomer
??SELECT?[@DimCustomer_test].CustomerKey,SUM(FactInternetSales.OrderQuantity)
?FROM?@DimCustomer_test??INNER?JOIN?FactInternetSales???ON
?@DimCustomer_test.CustomerKey?=?FactInternetSales.CustomerKey
?Group?BY?CustomerKey
?
Result:
?
Server:?Msg?137,?Level?15,?State?2,?Line?32
Must?declare?the?variable?’@DimCustomer_test’.
?
?
如果我們對(duì)上面的查詢進(jìn)行更改,對(duì)查詢使用別名(并且找開IO):
-----in?the?follow?script,we?used?the?table?alias.
?DECLARE?@DimCustomer_test?TABLE?
?(
????[CustomerKey]?[int]
????,??????[FirstName]?[nvarchar](50)??
,[MiddleName]?[nvarchar](50)??
,[LastName]?[nvarchar](50)?
????)
?INSERT?@DimCustomer_test?
?(
????[CustomerKey]??
????,??????[FirstName]??
,[MiddleName]??
,[LastName]?
????)
?SELECT??
????[CustomerKey]??
????,??????[FirstName]??
,[MiddleName]??
,[LastName]?
?FROM?DimCustomer
?SELECT?t.CustomerKey,f.OrderQuantity
?FROM?@DimCustomer_test?t?INNER?JOIN?FactInternetSales??f?ON
?t.CustomerKey?=?f.CustomerKey
?where?t.CustomerKey=13513
?
表變量在批處理結(jié)束時(shí)自動(dòng)被系統(tǒng)刪除,所以你不必要像使用臨時(shí)表表一樣顯示的對(duì)它進(jìn)行刪除.
文章來源:http://henrya2.blog.163.com/blog/static/754514192008102110528311
轉(zhuǎn)載于:https://www.cnblogs.com/Henrya2/archive/2008/11/21/1344246.html
總結(jié)
以上是生活随笔為你收集整理的[导入]SQL中的临时表和表变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VForum 2008系列之三:分论坛视
- 下一篇: SQL查询效率:100w数据查询只需要1