| 維度 | SELECT INTO | CREATE TABLE + INSERT |
|---|---|---|
| 速度 | 極快 (最小記錄、單掃描) | 稍慢 (完整記錄、兩階段) |
| 系統表鎖定 | 較久 (鎖定 sysobjects/sysindexes/syscolumns) | 極短 (僅建立元資料瞬間) |
| 併發適用性 | 低 (易阻塞其他 Tempdb 物件建立) | 高 (推薦生產併發環境) |
| 結構控制 | 自動推導 (無法指定 PK/索引/約束/身分欄) | 完全控制 (可預建索引、約束、計算欄) |
| 記錄模式 | 最小記錄 (簡單/大量記錄復原模式) | 完整記錄 (可配合 TABLOCK 達最小記錄) |
SELECT INTOCREATE 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 專屬後綴)。sys.objects 可見內部名,不可直接用內部名操作,務必用邏輯名 #name。當需在多預存程序/函數間共用表值、需顯式建立索引、或資料量大涉及複雜查詢時,使用臨時表。其餘小資料集、單一批次暫存、避免重編譯場景,優先考慮表變數 (DECLARE @t TABLE(...))。