日常開發中,單次寫入數十上百筆測試資料是家常便飯。最直覺的做法——複製貼上 N 條 `INSERT INTO ... VALUES (...)`——不僅程式碼冗長,少個分號、多個逗號就得花十分鐘找錯誤。本文對比三種寫法,從相容性、可讀性、效能三維度助你選出最佳方案。
目標表:`MyTable (ID INT, NAME VARCHAR(10))`,需一次插入 3 筆資料(實務常見數百筆)。
INSERT INTO MyTable(ID, NAME) VALUES(1, '123');
INSERT INTO MyTable(ID, NAME) VALUES(2, '456');
INSERT INTO MyTable(ID, NAME) VALUES(3, '789');
INSERT INTO MyTable(ID, NAME)
SELECT 4, '000'
UNION ALL SELECT 5, '001'
UNION ALL SELECT 6, '002';
INSERT INTO MyTable(ID, NAME)
VALUES (7, '003'), (8, '004'), (9, '005');
| 維度 | 多行 VALUES | UNION ALL | 行構造子 (2008+) |
|---|---|---|---|
| 相容版本 | All | 2000+ | 2008+ |
| 陳述式數 | N | 1 | 1 |
| 網路往返 | N | 1 | 1 |
| 編譯/優化 | N 次 | 1 次 | 1 次 |
| 程式碼行數 | 最多 | 中等 | 最少 |
| 最大值組數 | 無限制 | 實際受限於查詢複雜度 | 1000 組 |
| 推薦指數 | ⭐ | ⭐⭐⭐ (舊版必備) | ⭐⭐⭐⭐⭐ (現代首選) |
IF 目標環境 >= SQL Server 2008
AND 筆數 <= 1000
→ 直接用 行構造子 (VALUES (...), (...), ...)
ELSE IF 目標環境 >= SQL Server 2000
OR 筆數 > 1000
→ 用 UNION ALL 分批(每批 500~800 行)
ELSE
→ 無奈只能用 多行 VALUES(建議在應用層組批次 SQL 執行)
若資料量達萬筆以上,上述三種 `INSERT` 寫法皆非最佳解。請改用:
結論:告別複製貼上 N 行 `INSERT VALUES`。SQL Server 2008+ 環境請毫猶豫使用 行構造子;舊版環境用 UNION ALL;超大量資料上 Bulk Insert / TVP。寫出可維護、高效能的批次插入,是資料庫開發者的基本功。