SQL Server 2008 擴充 VALUES 子句,支援 **單一 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)
INSERT ... VALUES 或 UNION ALL。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);
輸出結果:
| DName | DCode | DDate |
|---|---|---|
| DemoA | AAA | 2010-10-12 20:37:45.500 |
| DemoB | BBB | 2010-10-12 20:37:45.500 |
| DemoC | CCC | 2010-10-12 20:37:45.500 |
| DemoD | DDD | 2010-10-12 20:37:45.500 |
| DemoE | EEE | 2010-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 複雜 | 一行式建構 |
Table-Valued Parameter 或 BCP。DEFAULT 關鍵字,需顯式提供所有欄位值。-- 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 衍生表語法更緊湊,且明確定義欄位順序/型別,適合臨時、小規模資料集。