CREATE SEQUENCE dbo.SQ_1 AS BIGINT START WITH 1 INCREMENT BY 1;
SELECT NEXT VALUE FOR dbo.SQ_1 AS FirstUse;
INSERT INTO t1(c1,c2) VALUES (NEXT VALUE FOR SQ_1, 'Test');
⚠️ 無 CURRVAL 等價函數,只能取 NEXT VALUE;需當前值請自行存表或用 IDENTITY。
-- 舊寫法
SELECT * FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY Id) RN FROM t) x WHERE RN BETWEEN 11 AND 20;
-- 新寫法(SQL 2012+)
SELECT * FROM t ORDER BY Id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
代碼簡潔、語義明確、執行計劃穩定,大表分頁首選。
| 函數 | 類比 | 示例 | 備註 |
|---|---|---|---|
IIF(cond, true_v, false_v) | C# ?: / VBA IIF | IIF(Size>100,'Big','Small') | 替代簡單 CASE WHEN |
CONCAT(v1,v2,...) | 自動轉字符串、忽略 NULL | CONCAT(Code,',',Name,',',Size) | 省去 ISNULL+CAST |
FORMAT(val, fmt) | C# String.Format | FORMAT(CreatedTime,'yyyy-MM-dd') | 日期/數字格式化神器 |
CHOOSE(idx, v1,v2,...) | 枚舉轉標籤 | CHOOSE(Status,'Plan','Exec','Done') | 索引從 1 起、不支援 0/負數、無 default |
EOMONTH(date) | 月末日期 | EOMONTH(GETDATE()) | 其餘日期構造函數少用 |
OVER 不再限於排序函數,**聚合函數也可跟 OVER**;新增 FIRST_VALUE、LAST_VALUE、LAG、LEAD 等分析函數。
SELECT DISTINCT c.*,
FIRST_VALUE(p.Code) OVER (PARTITION BY c.ClientId ORDER BY p.CreatedTime DESC) AS LastProjectCode
FROM Project p
INNER JOIN Client c ON p.ClientId = c.ClientId;
無需自關聯、無需子查詢,一行搞定「分組取最新/最舊/前後行」經典難題。
CHOOSE 因限制較多(不支援 0、非連續、無 default),建議繼續用 CASE 或查表關聯。SQL Server 2012 是 T-SQL 語法現代化的分水嶺。Sequence、OFFSET/FETCH、IIF/CONCAT/FORMAT、分析函數,每一項都直擊開發痛點。升級不僅是版本號變化,更是生產力工具箱的豐富。