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

SQL Server 2008 VALUES 子句新用法:多列插入與虛擬資料表建構

     編輯:關於SqlServer

前言

SQL Server 2008 擴充 VALUES 子句,支援 **單一 INSERT 多列插入** 以及 **衍生資料表 (虛擬資料表) 直接查詢**,無需建立暫存表/資料表變數,語法簡潔且效能優異。

一、單一 INSERT 多列插入

CREATE TABLE Demo_Values (
    PKID INT IDENTITY(1,1) PRIMARY KEY,
    DName NVARCHAR(20),
    DCode NVARCHAR(30),
    DDate DATETIME
);

INSERT INTO Demo_Values (DName, DCode, DDate)
VALUES
    (N'DemoA', N'AAA', GETDATE()),
    (N'DemoB', N'BBB', GETDATE()),
    (N'DemoC', N'CCC', GETDATE()),
    (N'DemoD', N'DDD', GETDATE()),
    (N'DemoE', N'EEE', GETDATE());
-- (5 row(s) affected)
  • 每組值用括號包裹,以逗號分隔。
  • 單陳述式最多 1000 組值列 (超過請分批或用 BCP/Table-Valued Parameter)。
  • 效能遠優於多次 INSERT ... VALUES 或 UNION ALL。

二、VALUES 建構虛擬資料表直接查詢

SELECT DName, DCode, DDate
FROM (
    VALUES
        (N'DemoA', N'AAA', GETDATE()),
        (N'DemoB', N'BBB', GETDATE()),
        (N'DemoC', N'CCC', GETDATE()),
        (N'DemoD', N'DDD', GETDATE()),
        (N'DemoE', N'EEE', GETDATE())
) AS Demo_Values (DName, DCode, DDate);

輸出結果:

DNameDCodeDDate
DemoAAAA2010-10-12 20:37:45.500
DemoBBBB2010-10-12 20:37:45.500
DemoCCCC2010-10-12 20:37:45.500
DemoDDDD2010-10-12 20:37:45.500
DemoEEEE2010-10-12 20:37:45.500

關鍵語法點

  • VALUES (...) , (...) ... 後**必須加別名** (此處 AS Demo_Values)。
  • 別名後的欄位清單 (DName, DCode, DDate) 定義虛擬資料表結構,供外層 SELECT 參考。
  • 可直接參與 JOIN、UNION、APPLY 等運算。

三、實務應用場景

場景傳統做法VALUES 新寫法
測試資料快速產生建立 #temp → INSERT 多行直接 VALUES 查詢或 INSERT
小型查找表 (代碼/說明)建立永久表或函數回傳表值VALUES 衍生表 JOIN 主查詢
動態 IN 清單字串拼接 IN ('A','B') 或 XML 拆解VALUES 衍生表 INNER JOIN
單位測試 Mock 資料Setup 複雜一行式建構

四、效能與限制

  • ✅ **編譯階段常數摺疊**,執行計畫極簡。
  • ✅ 無鎖定、無記錄、無統計資料維護成本。
  • ⚠️ **1000 列上限**,大量資料請用 Table-Valued Parameter 或 BCP。
  • ⚠️ 不支援 DEFAULT 關鍵字,需顯式提供所有欄位值。

五、對比:CTE vs VALUES 衍生表

-- CTE 寫法 (相容 SQL 2005+)
WITH Demo_Values AS (
    SELECT N'DemoA' AS DName, N'AAA' AS DCode, GETDATE() AS DDate UNION ALL
    SELECT N'DemoB', N'BBB', GETDATE() UNION ALL
    SELECT N'DemoC', N'CCC', GETDATE()
)
SELECT * FROM Demo_Values;

-- VALUES 寫法 (SQL 2008+,更簡潔)
SELECT * FROM (
    VALUES (N'DemoA', N'AAA', GETDATE()), (N'DemoB', N'BBB', GETDATE()), (N'DemoC', N'CCC', GETDATE())
) AS Demo_Values (DName, DCode, DDate);

VALUES 衍生表語法更緊湊,且明確定義欄位順序/型別,適合臨時、小規模資料集。

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