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)