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

SQL Server 批次插入三大寫法對決:從繁瑣 VALUES 到 2008 行構造子的效能躍升

     編輯:DB2 教學

日常開發中,單次寫入數十上百筆測試資料是家常便飯。最直覺的做法——複製貼上 N 條 `INSERT INTO ... VALUES (...)`——不僅程式碼冗長,少個分號、多個逗號就得花十分鐘找錯誤。本文對比三種寫法,從相容性、可讀性、效能三維度助你選出最佳方案。

測試場景

目標表:`MyTable (ID INT, NAME VARCHAR(10))`,需一次插入 3 筆資料(實務常見數百筆)。

寫法一:傳統多行 VALUES(全版本相容)


INSERT INTO MyTable(ID, NAME) VALUES(1, '123');
INSERT INTO MyTable(ID, NAME) VALUES(2, '456');
INSERT INTO MyTable(ID, NAME) VALUES(3, '789');
  • 優點:所有 SQL Server 版本支援,語意直觀。
  • 缺點:程式碼冗長、維護困難、每條語句獨立編譯執行、網路往返多、效能最差。

寫法二:UNION ALL 聯合查詢插入(SQL Server 2000+ 相容)


INSERT INTO MyTable(ID, NAME)
SELECT 4, '000'
UNION ALL SELECT 5, '001'
UNION ALL SELECT 6, '002';
  • 優點:單一陳述式、單次編譯優化、單次網路往返、效能顯著優於寫法一、舊版本也能用。
  • 缺點:語法稍顯冗長、超過 1000 行時可能觸發查詢優化器限制(需分批)。

寫法三:行構造子 / Table Value Constructor(SQL Server 2008+ 專屬)


INSERT INTO MyTable(ID, NAME)
VALUES (7, '003'), (8, '004'), (9, '005');
  • 優點:語法最精簡、可讀性最佳、單一陳述式、優化器可產生最優計劃、支援最多 1000 組值(超過需分批或改用 `INSERT ... SELECT`)。
  • 缺點:僅限 SQL Server 2008 及以上版本。

效能與適用性快速對照

維度多行 VALUESUNION ALL行構造子 (2008+)
相容版本All2000+2008+
陳述式數N11
網路往返N11
編譯/優化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` 寫法皆非最佳解。請改用:

  • BCP / Bulk Insert / SqlBulkCopy (.NET):最小日誌、極速載入。
  • Table-Valued Parameter (TVP, 2008+):應用層傳遞 `DataTable`/`IEnumerable` 給預存程序,單次批次插入,型別安全、效能極佳。
  • INSERT ... SELECT FROM OPENROWSET(BULK...):直接從檔案匯入。

結論:告別複製貼上 N 行 `INSERT VALUES`。SQL Server 2008+ 環境請毫猶豫使用 行構造子;舊版環境用 UNION ALL;超大量資料上 Bulk Insert / TVP。寫出可維護、高效能的批次插入,是資料庫開發者的基本功。

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