臨時表是 T-SQL 開發中極常用的中間資料容器。本文系統整理區域/全域臨時表差異、效能優勢、存儲程序作用域陷阱、日誌/鎖定行為,助你避坑並用好這把利器。
| 特性 | 區域臨時表 (#temp) | 全域臨時表 (##temp) |
|---|---|---|
| 命名前綴 | # | ## |
| 可見性 | 僅建立者的目前工作階段 | 所有連線的工作階段皆可見 |
| 自動清除時機 | 工作階段結束 (或存儲程序結束) | 建立者工作階段結束且無其他工作階段參考時 |
| 安全性 | 高 (隔離性佳) | 低 (需防止命名衝突與資料洩露) |
區域臨時表在存儲程序內建立,屬於「子工作階段」,存儲程序結束即銷毀。 外層呼叫者無法直接讀取該臨時表。
CREATE PROC usp_Inner
AS
CREATE TABLE #t (id INT);
INSERT #t VALUES (1);
-- 此處 #t 仍存在
GO
CREATE PROC usp_Outer
AS
EXEC usp_Inner;
SELECT * FROM #t; -- 錯誤:Invalid object name '#t'
GO
解法:在存儲程序輸出參數或結果集回傳資料,或改用全域臨時表 (需自行管理清理)。
tempdb 版本存放區膨脹。#sp_Sales_Detail、#etl_Stage_Customer。