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

SQL Server 建立臨時表完整說明:SELECT INTO 與 CREATE TABLE 效能抉擇

     編輯:關於SqlServer

兩大建立路徑效能對比

維度SELECT INTOCREATE TABLE + INSERT
速度極快 (最小記錄、單掃描)稍慢 (完整記錄、兩階段)
系統表鎖定較久 (鎖定 sysobjects/sysindexes/syscolumns)極短 (僅建立元資料瞬間)
併發適用性低 (易阻塞其他 Tempdb 物件建立)高 (推薦生產併發環境)
結構控制自動推導 (無法指定 PK/索引/約束/身分欄)完全控制 (可預建索引、約束、計算欄)
記錄模式最小記錄 (簡單/大量記錄復原模式)完整記錄 (可配合 TABLOCK 達最小記錄)

選擇準則

  • 單次大量載入、低併發、臨時分析 → SELECT INTO
  • 高併發 OLTP、需索引/約束、重複使用結構 → CREATE TABLE + INSERT

標準建表範本

-- 區域臨時表
CREATE TABLE #Tmp (
  ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
  WorkNo VARCHAR(50) NULL
);

-- 全域臨時表
CREATE TABLE ##GlobalTmp (
  ID INT PRIMARY KEY,
  Data VARCHAR(100)
);

常用操作範例

-- 查詢
SELECT * FROM #Tmp;

-- 清空 (保留結構、重設身分值、最小記錄)
TRUNCATE TABLE #Tmp;

-- 刪除
DROP TABLE #Tmp;

-- 動態逐列處理範例 (教學用,實務優先集合操作)
DECLARE @WorkNo VARCHAR(500), @Str NVARCHAR(4000), @Count INT, @i INT = 0;
SELECT @Count = COUNT(DISTINCT WorkNo) FROM #Tmp;
WHILE @i < @Count BEGIN
  SET @Str = N'SELECT TOP 1 @W = WorkNo FROM #Tmp WHERE ID NOT IN (SELECT TOP ' + CAST(@i AS NVARCHAR(10)) + N' ID FROM #Tmp)';
  EXEC sp_executesql @Str, N'@W VARCHAR(500) OUTPUT', @WorkNo OUTPUT;
  PRINT @WorkNo;
  SET @i += 1;
END

臨時表命名與內部儲存

  • 區域 #name → Tempdb 內部名 #name______________________000000000012 (含 Session 專屬後綴)。
  • 名稱限制 116 字元 (預留後綴空間)。
  • sys.objects 可見內部名,不可直接用內部名操作,務必用邏輯名 #name。

約束限制

  • 支援:PK、UNIQUE、CHECK、DEFAULT、NOT NULL、IDENTITY。
  • 不支援 FOREIGN KEY:指定會警告並忽略,表仍建立但無 FK。
  • 不可被其他表的 FK 參考。

預存程序/觸發器中的作用域規則

  1. 程序內建立的區域臨時表,程序結束自動刪除。
  2. 巢狀程序可建立同名表,內層遮蔽外層;內層結束刪除,外層恢復可見。
  3. 呼叫端 (Client) 建立的同名表,在程序內不可見 (被程序內同名表遮蔽或根本不同作用域)。

表變數替代建議

當需在多預存程序/函數間共用表值、需顯式建立索引、或資料量大涉及複雜查詢時,使用臨時表。其餘小資料集、單一批次暫存、避免重編譯場景,優先考慮表變數 (DECLARE @t TABLE(...))。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved