SQL Server 暫存表
一、#Table
CREATE TABLE #testTable ( [id] int, [name] varchar(10) ); INSERT INTO #testTable ([id],[name]) values (1,'Bill'); SELECT [id],[name] FROM #testTable;
執行畫面
說明:
1、該暫存表存在於記憶體 tempdb
2、當 SQL Server 關閉時,該暫存表會自動 drop,也可以自己手動 drop。
二、##Table
CREATE TABLE ##testTable2 ( [id] int, [name] varchar(10) ); INSERT INTO ##testTable2 ([id],[name]) values (1,'Bill'); SELECT [id],[name] FROM ##testTable2;
說明:
1、該暫存表存在於記憶體 tempdb
2、當 SQL Server 關閉時,該暫存表會自動 drop,也可以自己手動 drop。
3、兩者的差異在於,#Table只有建立者可以使用,其他人不可使用(其他資料庫),
而 ##Table 則是全域的資料表,所有人均可取用(其他資料庫也可使用)。
三、@Table
DECLARE @testTable3 as Table ( [id] int, [name] varchar(10) ); INSERT INTO @testTable3 ([id],[name]) values (1,'Bill'); SELECT [id],[name] FROM @testTable3; WAITFOR DELAY '00:00:30';
說明:
1、此種方式比較像是資料表變數,將資料表當作是一個變數來使用,
當批次指令執行完成後即自動從記憶體中被刪除。
2、不需使用DROP指令,當此次指令執行完後會自動被刪除。
3、此範例為建立一個 @Table 讓它30秒後執行。
30秒前,從 tempdb 暫存資料表中可以看到有一個 @temp 資料表(紅框)
30秒 SQL 執行完畢後,會發現,@Table 從資料庫記憶體中消失了。
四、select ... value
本範例示範另一種暫存表的用法
SELECT * FROM (VALUES (1), (2)) t(id)
執行結果
參考資料:
[iT鐵人賽Day33] SQL Server 暫存表(@ # ##)與CTE (Common Table Expressions)