首先讓我們來看看什麼是表變數和臨時表。
sql server 表變數
1.初識表變數
表變數在sql server 2000中首次被引用。表變數的定義和建立乙個表大致相同,只不過是使用declare @variable而不是create table,表變數定義包括列定義,列名,資料型別和約束(可用的約束有:主鍵約束、唯一約束、null約束、和check約束。注:外來鍵約束不可以哦)。表變數和其他變數不同,它不止存在於記憶體中,還存在於tempdb中。
2.表變數優點
1).表變數擁有特定的作用域(在當前批處理中),表變數在批處理結束後自動被清除。
2).在儲存過程中使用表變數較臨時表會減少儲存過程重新編譯的發生。
3).表變數需要更少的鎖請求和日誌資源。
4).可以在表變數上使用udf,uddt,xml
3.表變數的缺點
1).在表變數上沒有統計資訊,查詢優化器根據固定的預估值來選擇執行計畫,在資料量很大的情況下,會導致查詢優化器選擇很差的執行計畫。
2).不能在表變數上建立索引,但是可以通過建立約束(主鍵、唯一)來建立索引;
3).在 declare 之後,不能再對錶變數進行更改;
4).不能對錶變數使用 select into,insert exec 語句;
5).不能通過exec或sp_executesql 來執行牽涉表變數的動態sql語句,但如果表變數是在動態sql語句內定義的,則可以。
4.何時使用表變數(可以根據以下規則來判斷何時使用表變數)
1).表的行數
2).使用表變數能夠減少的重新編譯次數
3).查詢的型別和對索引或者統計資訊的依賴程度
4).是否需要使用udf,uddf,xml
5.表變數不能做的事
1).雖然表變數是乙個變數,但是其不能賦值給另乙個變數。
2).check約束、預設值、計算列不能引用自定義函式。
3).不能為約束命名
4).不能truncate 表變數
5).不能向標識列中插入顯示值(也就是說表變數不支援set identity_insert on)
sql server 臨時表
臨時表和create table語句建立的表的不同之處在於:
1).臨時表的名稱不能超過116個字元,這是由於資料庫引擎為了辨別不同會話建立的臨時表,會自動在臨時表名字後附加一串。
2).區域性臨時表作用域僅僅在當前的連線內,從儲存過程中建立區域性臨時表的角度來看,區域性臨時表會在以下情況下別drop:
a.顯示呼叫drop table語句
b.當區域性臨時表在儲存過程內被建立時,儲存過程結束就意味著區域性臨時表被drop
c.當前會話結束,在會話內建立的所有區域性臨時表都會被drop。
3).全域性臨時表在所有的會話內可見,但是在其建立的會話結束後即被drop,drop後其它會話也將不能對其進行引用。
4).不能對臨時表進行分割槽。
5).不能對臨時表加外來鍵約束。
6).臨時表內列的資料型別不能定義成沒有在tempdb中沒有定義自定義資料型別(自定義資料型別是資料庫級別的物件,而臨時表屬於tempdb)。由於tempdb在每次sql server重啟後會被自動建立,所以你必須使用startup stored procedure來為tempdb建立自定義資料型別。你也可以通過修改model資料庫來達到這一目標。
7).xml列不能定義成xml集合的形式,除非這個集合已經在tempdb中定義。
至於表變數和臨時表的區別,在介紹表變數時所提到的優缺點中基本概括了,另外還有乙個區別是體現在排序規則上:表變數使用當前資料庫的排序規則,臨時表使用tempdb的排序規則。如果它們不相容,你還需要在查詢或者表定義中進行指定。
下面是看到的別人整理的一張**,看著清晰一點。
總結特性
表變數臨時表
作用域當前批處理
當前會話,巢狀儲存過程,全域性:所有會話
使用場景
自定義函式,儲存過程,批處理
自定義函式,儲存過程,批處理
建立方式
declare statement only.只能通過decleare語句建立
create table 語句
select into 語句.
表名長度
最多128位元組
最多116位元組
列型別可以使用自定義資料型別
可以使用xml集合
自定義資料型別和xml集合必須在tempdb內定義
collation
字串排序規則繼承自當前資料庫
字串排序規則繼承自tempdb資料庫
索引索引必須在表定義時建立
索引可以在表建立後建立
約束primary key, unique, null, check約束可以使用,但必須在表建立時宣告
primary key, unique, null, check. 約束可以使用,可以在任何時後新增,但不能有外來鍵約束
表建立後使用ddl (索引,列)
不允許允許.
資料插入方式
insert 語句 (sql 2000: 不能使用insert/exec).
insert 語句, 包括 insert/exec.
select into 語句.
insert explicit values into identity columns (set identity_insert).
不支援set identity_insert語句
支援set identity_insert語句
truncate table
不允許允許
析構方式
批處理結束後自動析構
顯式呼叫 drop table 語句.
當前會話結束自動析構 (全域性臨時表: 還包括當其它會話語句不在引用表.)
事務只會在更新表的時候有事務,持續時間比臨時表短
正常的事務長度,比表變數長
儲存過程重編譯
否會導致重編譯
回滾不會被回滾影響
會被回滾影響
統計資料
不建立統計資料,所以所有的估計行數都為1,所以生成執行計畫會不精準
建立統計資料,通過實際的行數生成執行計畫。
作為引數傳入儲存過程
僅僅在sql server2008, 並且必須預定義 user-defined table type.
不允許顯式命名物件 (索引, 約束).
不允許允許,但是要注意多使用者的問題
動態sql
必須在動態sql中定義表變數
可以在呼叫動態sql之前定義臨時表
T SQL系列 臨時表 表變數
臨時表 臨時表與永久表相似,只是它的建立是在tempdb中,它只有在乙個資料庫連線結束後或者由sql命令drop掉,才會消失,否則就會一直存在。臨時表在建立的時候都會產生sql server的系統日誌,雖它們在tempdb中體現,是分配在記憶體中的,它們也支援物理的磁碟,但使用者在指定的磁碟裡看不到...
動態建立臨時表,根據變數動態命名臨時表表名
create proc up createtmptable14 id int aswhile id 3 begin declare sql varchar 8000 select sql select sql select into t1 cast id as varchar 10 from db ...
SQL 表變數和臨時表
sql 表變數和臨時表 表變數 儲存在記憶體中,作用域是指令碼的執行過程中,指令碼執行完畢之後就會釋放記憶體,適合短時間內儲存資料量小的資料集。優點 使用靈活,使用完之後立即釋放,不占用物理儲存空間 缺點 只適合較小資料量的暫時儲存,不能建索引,資料量稍大時查詢效率慢,佔記憶體 使用臨時表和表變數的...