本文導讀:定義一個(gè)sql server表變量的方法和定義一個(gè)用戶(hù)自定義表的方法是一樣的;然而,定義了一個(gè)表變量之后,你就不能再改變該表的定義了。而且你必須在定義這個(gè)表變量的時(shí)候給出它所有屬性的定義.
定義一個(gè)sql server表格變量的方法和定義一個(gè)用戶(hù)自定義表格的方法是一樣的;例如
1.
DECLARE @T_ChartsIdeaItem1 Table(XData char(20) null,YData char(20) null)
INSERT INTO @T_ChartsIdeaItem1(XData,YData)VALUES ('BU9876', 'Creating')
select * from @T_ChartsIdeaItem1
2.
DECLARE@News table
(
News_id int NOT NULL,
NewsTitle varchar(100),
NewsContent varchar(2000),
NewsDateTime datetime
)
INSERT INTO @News (News_id, NewsTitle, NewsContent,NewsDateTime)
VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
SELECT News_id, NewsTitle, NewsContent,NewsDateTime FROM @News
不是所有的INSERT命令都可以對表格變量執行操作。比如,當你向一個(gè)表格變量插入變量值時(shí),你就不能用EXEC命令。通過(guò)執行一個(gè)已保存的程序或是一系列命令來(lái)為一個(gè)表格變量插入變量值將會(huì )返回錯誤的結果。而且,也不是所有的SELECT命令都可以對表格變量執行操作,你不能用SELECT INTO命令來(lái)為一個(gè)表格變量插入數據。
對于sql server表格變量,你不能使用某些系統程序,比如sp_depends。運行時(shí)產(chǎn)生的并被隨機命名的表格變量的對象名被存儲在tempdb數據庫中。由于大多數系統功能和系統程序需要對象名和標識代碼,所以對一個(gè)表格變量執行系統功能和系統程序就是一件很困難的事。為了對一個(gè)表格變量執行系統功能和系統程序,我們需要先進(jìn)行一些復雜的調整以獲取該表格變量的對象名和/或標識代碼。
一個(gè)表格變量的有效范圍就是整個(gè)批處理,程序,或函數的處理過(guò)程。當在一段程序中發(fā)出GO命令時(shí),表格變量就不再起作用了。
1. 為什么要使用表變量
表變量是從2000開(kāi)始引入的,微軟認為與本地臨時(shí)表相比,表變量具有如下優(yōu)點(diǎn):
a.與其他變量的定義一樣,表變量具有良好的定義范圍,并會(huì )被自動(dòng)清除;
b.在存儲過(guò)程中使用表變量會(huì )減少存儲過(guò)程重新編譯的發(fā)生;
c.表變量需要更少的鎖請求和日志資源;
d.可以在表變量上使用UDF,UDDT,XML。
2、表變量的限制
與臨時(shí)表相比,表變量存在著(zhù)如下缺點(diǎn):
a.在表變量上沒(méi)有統計信息,查詢(xún)優(yōu)化器根據固定的預估值來(lái)選擇執行計劃,在數據很多的情況下,會(huì )導致查詢(xún)優(yōu)化器選擇很差的執行計劃;
b.不能直接在表變量上創(chuàng )建索引,但可以通過(guò)創(chuàng )建約束(主鍵、唯一)來(lái)建立索引;
c.在DECLARE后,不能再對表變量進(jìn)行更改;
d.不能對表變量執行INSERT EXEC,SELECT INTO語(yǔ)句;
e.不能通過(guò)EXEC或sp_executesql來(lái)執行牽涉到表變量的動(dòng)態(tài)SQL語(yǔ)句,但如果表變量是在動(dòng)態(tài)SQL語(yǔ)句內定義的,則可以。
3、那什么時(shí)候可以使用表變量
要使用表變量應該根據如下規則來(lái)判斷:
a.表的行數;
b.使用表變量能夠減少的重新編譯次數;
c.查詢(xún)的類(lèi)型和對索引或者統計信息的依賴(lài)程度;
d.需要生用UDF,UDDT,XML的時(shí)候。
其實(shí)也就說(shuō),得從實(shí)際出發(fā),根據具體的查詢(xún),作出具體的選擇。但是,其中很關(guān)鍵的一點(diǎn),如果表的行數非常多,使用表變量其實(shí)是更費資源的。有人提出了這樣的建議:對于行數較少的情況下(小于1000行)可以使用表變量;如果行數很多(有幾萬(wàn)行),則使用臨時(shí)表。
4、使用表變量的誤區
對于表變量,很多人認為,表變量和其他變量一樣,只存在內存中,其實(shí)這是不正確的,表變量也存在tempdb中。
臨時(shí)表:
代碼示例:
CREATETABLE dbo.#News
(
News_id int NOT NULL,
NewsTitle varchar(100),
NewsContent varchar(2000),
NewsDateTime datetime
)
INSERT INTO dbo.#News (News_id, NewsTitle,NewsContent, NewsDateTime)
VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
SELECT News_id, NewsTitle, NewsContent,NewsDateTime FROM dbo.#News
DROP TABLE dbo.[#News]
比較臨時(shí)表及表變量都可以通過(guò)SQL的選擇、插入、更新及刪除語(yǔ)句,它們的的不同主要體現在以下這些:
1)當用戶(hù)在訪(fǎng)問(wèn)表變量時(shí),SQLServer是不產(chǎn)生日志的,而在臨時(shí)表中是產(chǎn)生日志的;
2)在表變量中,是不允許有非聚集索引的;
3)表變量是不允許有DEFAULT默認值,也不允許有約束;
4)臨時(shí)表上的統計信息是健全而可靠的,但是表變量上的統計信息是不可靠的;
5)臨時(shí)表中是有鎖的機制,而表變量中就沒(méi)有鎖的機制。