T SQL之表變數與臨時表的比較

2022-02-08 21:04:50 字數 1503 閱讀 3783

參考:

總結

特性

表變數

臨時表

作用域當前批處理

當前會話,巢狀儲存過程,全域性:所有會話

使用場景

自定義函式,儲存過程,批處理

自定義函式,儲存過程,批處理

建立方式

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之表變數與臨時表的比較

參考 總結 特性表變數臨時表 作用域當前批處理 當前會話,巢狀儲存過程,全域性 所有會話 使用場景 自定義函式,儲存過程,批處理 自定義函式,儲存過程,批處理 建立方式 declare statement only.只能通過decleare語句建立 create table 語句 select in...

臨時表與表變數

臨時表 表變數的比較 1 臨時表 臨時表包括 以 開頭的區域性臨時表,以 開頭的全域性臨時表。a 儲存 不管是區域性臨時表,還是全域性臨時表,都會放存放在tempdb資料庫中。b 作用域 區域性臨時表 對當前連線有效,只在建立它的儲存過度 批處理 動態語句中有效,類似於c語言中區域性變數的作用域。全...

表變數與臨時表

什麼情況下使用表變數?什麼情況下使用臨時表?表變數 declare tb table id int identity 1,1 name varchar 100 insert tb select id,name from mytable where name like zhang 臨時表 select...