[SQL] SQL Server 暫存表(Temp Table #Table ##Table)、暫存變數表(Temp Variable @Table)

  • 2726
  • 0
  • 2022-12-08

[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 筆)。