一般全域暫存表 (`##Table`) 隨**建立它的 Session 結束而自動刪除**。若需一個**跨 Session、跨重啟、僅手動 DROP 才移除**的全域暫存表,可結合 **啟動預存程序 (Startup Procedure)** 實現。
USE master;
GO
IF OBJECT_ID('dbo.sp_Globals') IS NOT NULL
DROP PROC dbo.sp_Globals;
GO
CREATE PROC dbo.sp_Globals
AS
BEGIN
CREATE TABLE ##Globals
(
id VARCHAR(36) NOT NULL PRIMARY KEY,
value VARCHAR(500)
);
END;
GO
-- 標記為啟動程序
EXEC dbo.sp_procoption 'dbo.sp_Globals', 'startup', 'true';
GO
| 風險 | 對策 |
|---|---|
| 資料隨服務重啟遺失 | 僅存可重算/可重載的暫態資料;關鍵資料落地實體表 |
| 佔用 tempdb 空間 | 監控 `tempdb` 使用量,定期清理過期資料 |
| 並發寫入衝突 | 主鍵約束 + 應用層邏輯協調;必要時用 `sp_getapplock` |
| 安全性:所有登入用戶可見 | 敏感資料勿存;或改用 `CONTEXT_INFO`/`SESSION_CONTEXT` 隔離 |
| 啟動程序失敗導致 SQL 啟動延遲 | 程式碼極簡化、加 `TRY/CATCH`、記錄錯誤到 `ERRORLOG` |
| 方案 | 持久性 | 隔離性 | 效能 | 維護 |
|---|---|---|---|---|
| 啟動程序 + ##GlobalTempTable | 服務重啟保留結構 | 無 (全域可見) | 極高 (tempdb 記憶體優化) | 低 (自動重建) |
| 實體表 + 定時清理作業 | 永久 | 可控 (權限/Schema) | 中 (磁碟 I/O) | 中 (需清理排程) |
| Memory-Optimized Table (Hekaton) | 永久 (耐久性可選) | 可控 | 最高 (無鎖) | 高 (記憶體容量規劃) |
| Application Cache (Redis/IMemoryCache) | 視基礎設施 | Key 隔離 | 高 (網路跳數) | 中 (額外元件) |
啟動預存程序 + `##GlobalTempTable` 是 **零成本、高效能、自動重建** 的跨 Session 暫存共享方案。用對場景(配置快取、協調旗標、中間結果),能大幅簡化架構;切記**資料不持久、權限全開**,敏感業務勿用。