首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 暫存表完全指南:區域暫存表 vs 全域暫存表

     編輯:關於SqlServer

暫存表分兩種:#temp(區域)與 ##temp(全域),生命週期與可見度截然不同。

行為差異實測

區域暫存表 #tempTable

  • 僅在建立它的會話中可見。
  • 會話結束時自動清除,無需手動 DROP。
  • 不同會話可建立同名 #tempTable,互不干擾。

全域暫存表 ##tempTable

  • 對所有會話可見。
  • 直到建立會話結束且無其他會話參考時才自動清除。
  • 需顯式 DROP TABLE ##tempTable 釋放,否則佔用 tempdb 空間。

實測步驟

  1. 查詢視窗 1:CREATE TABLE #t (id INT); INSERT #t VALUES (1);
  2. 同視窗:SELECT * FROM #t → 成功。
  3. 查詢視窗 2:SELECT * FROM #t → 錯誤:找不到物件。
  4. 改用 ##t 重複上述 → 視窗 2 可正常查詢。

選擇建議

場景建議
單一預存程序/批次內部暫存#temp(區域),自動清理、隔離性好
跨會話、跨預存程序共享資料##temp(全域),但需自行管理清理
高併發、大量資料考慮表變數 @t TABLE(...) 或記憶體優化表,減少 tempdb 壓力

常見誤區

  • 誤以為 #temp 跨會話可見 → 導致「找不到物件」錯誤。
  • 全域暫存表未 DROP 導致 tempdb 膨脹。
  • 在動態 SQL 中建立 #temp,外層無法存取(動態 SQL 為獨立會話範圍)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved