[SQL] SQL Server 暫存表(Temp Table #Table ##Table)、暫存變數表(Temp Variable @Table)
前言
工作上會用到Temp Table及Temp Variable,查了相關資料之後作為記錄。
暫存表 Temp Table
- 暫存表是在執行時在系統資料庫的tempdb中實體建立出來的資料表。
- 暫存表與一般的資料表類似,可以設定constraints, keys, indexes。
- 有以下類型的暫存表
- 本地暫存表 Local Temp Table
- 全局暫存表 Global Temp Table
本地暫存表 #Table
- 本地暫存表僅在當前建立出#Table的Session可以使用,Session結束時會自動刪除。
- 可以使用現有資料表的資料塞入Temp Table,或是預先宣告Temp Table的結構。
範例一
Select * Into [#tempTable]
From [資料表名稱]
用完請記得刪除,否則在同一個Session中再執行一次的話,會出現下列錯誤訊息

刪除
drop table #tempTable;
範例二
CREATE TABLE #tempTable
(
[Column1] Int,
[Column2] Nvarchar(50),
)
INSERT INTO #tempTable (Column1,Column2) VALUES (1,'temp');
SELECT * FROM #tempTable;

何時使用本地暫存表?
- 需要暫存的資料很多(超過 100 筆)。
- 應用情境只能單獨使用。
- 如果需要使用Index時。
- 不能在User Defined Functions 中使用暫存表。
全局暫存表 ##Table
- 與本地暫存表差不多
- 差別是建立的##Table,所有Session皆可以使用,所有的Session結束時才會自動刪除
暫存變數表 @Table
- 暫存變數表類似暫存表,用於暫存資料。
- 暫存變數表的使用範圍僅限於批次指令執行和Stored Procedure。一旦批次指令執行結束(例如Stored Procedure),便會自動從記憶體中被刪除。
- 暫存變數表名稱以“@”開頭。
- 暫存變數表需要使用“DECLARE”預先宣告結構。
- 對暫存變數表使用“INSERT”語句來儲存資料,不能對使用“Select * into @Table”
- 暫存變數表可以作為參數傳遞給Function和Stored Procedure。
範例
DECLARE @tempTable AS TABLE
(
[Column1] Int,
[Column2] Nvarchar(50)
);
INSERT INTO @tempTable (Column1,Column2) VALUES (1,'temp');
SELECT * FROM @tempTable;
何時使用暫存變數表?
- 將暫存資料儲存在User Defined Functions、Stored Procedure和query batches。
- 需要暫存的資料較少(少於 100 筆)。