臨時表與永久表相似,但臨時表存儲在tempdb中,當不再使用時會自動刪除。臨時表有兩種類型:本地和全局。它們在名稱、可見性以及可用性上有區別。
- 本地臨時表就是用戶在創建表的時候添加了“#”前綴的表,其特點是根據數據庫連接獨立。只有創建本地臨時表的數據庫連接有表的訪問權限,其它連接不能訪問該表;
- 不同的數據庫連接中,創建的本地臨時表雖然“名字”相同,但是這些表之間相互並不存在任何關系;在SQLSERVER中,通過特別的命名機制保證本地臨時表在數據庫連接上的獨立性。
- 真正的臨時表利用了數據庫臨時表空間,由數據庫系統自動進行維護,因此節省了表空間。並且由於臨時表空間一般利用虛擬內存,大大減少了硬盤的I/O次數,因此也提高了系統效率。
- 臨時表在事務完畢或會話完畢數據自動清空,不必記得用完后刪除數據。
全局臨時表:創建時添加“##”
數據庫連接1創建全局臨時表##Temp,##Temp被數據連接2使用排他鎖使用
(
BEGIN TRAN select * from ##Temp with(xlock)
),當數據庫連接1關閉時,臨時表##Temp並沒有隨着數據庫連接1的關閉而被釋放掉,只要數據庫連接2中啟動的事務沒有被回滾或提交,那么數據庫連接2會一直持有臨時表##Temp的排他鎖,這時Sqlserver會認為還有數據庫連接正在引用全局臨時表##Temp,所以##Temp不會被釋放掉。