全域暫存表 (##Table) 生命週期綁定建立會話 (Session),會話結束即自動刪除。若需跨會話、跨重啟永久存在的共享暫存表,可透過 啟動預存程序 (Startup Stored Procedure) 在 SQL Server 啟動時自動建立,並由引擎維護參考計數防止自動清除。本文提供完整建立步驟、驗證方法與適用場景。
##GlobalTemp:建立會話結束 → 自動刪除,其他會話查詢會報錯「物件不存在」。DROP 否不消失。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
SET NOCOUNT ON;
-- 建立全域暫存表,主鍵確保唯一性
CREATE TABLE ##GLOBALS (
ID VARCHAR(36) NOT NULL PRIMARY KEY, -- 可存 GUID
VALUE VARCHAR(500) -- 應用層序列化物件/JSON
);
END;
GO
-- 標記為啟動預存程序
EXEC SP_PROCOPTION 'DBO.SP_GLOBALS', 'STARTUP', 'TRUE';
GO
STARTUP = TRUE 的預存程序 (在 master 內建立)。SP_GLOBALS 建立 ##GLOBALS,引擎為啟動程序建立的全域暫存表維護 參考計數器 > 0。##GLOBALS,如應用設定快取、跨 Session 旗標、單一值狀態共享。DROP TABLE ##GLOBALS 或重新執行啟動程序 (重啟 SQL) 會重建。-- 1. 重啟 SQL Server 服務 (或手動執行 EXEC SP_GLOBALS)
-- 2. 任意會話查詢
SELECT * FROM TEMPDB.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '##GLOBALS';
-- 3. 讀寫測試
INSERT INTO ##GLOBALS VALUES (NEWID(), 'TestValue');
SELECT * FROM ##GLOBALS;
| 適用 | 不適用 / 注意 |
|---|---|
| 應用設定快取 (少量、頻繁讀取) | 大量資料 → 應用一般表 + 索引 |
| 跨 Session 旗標/鎖狀態 | 需交易一致性 → 一般表 + 明確交易 |
| 單一值狀態共享 (如排程最後執行時間) | 高併發寫入 → 考慮 SEQUENCE / IDENTITY 表 |
| 開發/測試環境快速原型 | 生產環境核心業務 → 正式表設計 |
##GLOBALS 任何擁有 TEMPDB INSERT/UPDATE/DELETE 權限的登入皆可存取。生產環境建議:
SP_GetGlobal/SP_SetGlobal 控制存取。EXECUTE 封裝程序權限,不直接授與表權限。