核心差異速查表
| 特性 | 暫存表 (# / ##) | 資料表變數 (@) |
| 儲存位置 | tempdb(實體頁面,可交換到磁碟) | tempdb(記憶體優先,壓力大時溢寫磁碟) |
| 作用域 | 連線層級(區域)或全域(##) | 批次/程序層級,離開批次即銷毀 |
| 統計資料 | 自動建立/更新,支援重編譯 | 無統計資料(預估 1 列),不觸發重編譯 |
| 索引/約束 | 支援所有 DDL(PK、FK、Unique、Check、預設值) | 僅宣告時定義 PK/Unique,事後不可 ALTER |
| 交易記錄 | 完整記錄,支援 Rollback | 僅記錄中繼資料,Rollback 不影響資料 |
| 平行處理 | 支援平行查詢 | 不支援平行計畫(串行) |
| 參數傳遞 | 不可作為參數傳入預存程序 | 可作為參數(READONLY)傳入 |
選擇指南
- 大量資料、需索引/統計、複雜查詢、平行化 → 暫存表
- 小資料集、簡單暫存、需傳遞給預存程序、避免重編譯 → 資料表變數
暫存表進階操作範例
CREATE TABLE #News (
News_id INT NOT NULL,
NewsTitle VARCHAR(100),
NewsContent VARCHAR(2000),
NewsDateTime DATETIME
);
-- 動態加入 PK、預設值
ALTER TABLE #News ADD CONSTRAINT PK_News PRIMARY KEY CLUSTERED (News_id);
ALTER TABLE #News ADD CONSTRAINT DF_NewsDateTime DEFAULT (GETDATE()) FOR NewsDateTime;
-- 全域暫存表範例
IF OBJECT_ID('tempdb..##wzg_test') IS NOT NULL DROP TABLE ##wzg_test;
CREATE TABLE ##wzg_test (id INT, name VARCHAR(100));
INSERT INTO ##wzg_test VALUES (1, 'wzh');
SELECT * FROM ##wzg_test;