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

SQL Server 2012 開發新特性速覽:Sequence、OFFSET/FETCH、IIF、CONCAT、FORMAT、CHOOSE、OVER 增強

     編輯:關於SqlServer

一、Sequence 對象:Oracle 風格序列終於來了

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。

二、OFFSET / FETCH 分頁:告別 ROW_NUMBER 套娃

-- 舊寫法
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 IIFIIF(Size>100,'Big','Small')替代簡單 CASE WHEN
CONCAT(v1,v2,...)自動轉字符串、忽略 NULLCONCAT(Code,',',Name,',',Size)省去 ISNULL+CAST
FORMAT(val, fmt)C# String.FormatFORMAT(CreatedTime,'yyyy-MM-dd')日期/數字格式化神器
CHOOSE(idx, v1,v2,...)枚舉轉標籤CHOOSE(Status,'Plan','Exec','Done')索引從 1 起、不支援 0/負數、無 default
EOMONTH(date)月末日期EOMONTH(GETDATE())其餘日期構造函數少用

四、OVER 子句增強 + 分析函數

OVER 不再限於排序函數,**聚合函數也可跟 OVER**;新增 FIRST_VALUE、LAST_VALUE、LAG、LEAD 等分析函數。

示例:每個客戶的最新項目 Code

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;

無需自關聯、無需子查詢,一行搞定「分組取最新/最舊/前後行」經典難題。

遷移建議

  1. 新項目 ≥ 2012:全面拥抱新語法,代碼量減 30%+。
  2. 存量 2008R2 維護:分頁保留 ROW_NUMBER,新模塊可嘗試 OFFSET/FETCH(需評估升級計劃)。
  3. CHOOSE 因限制較多(不支援 0、非連續、無 default),建議繼續用 CASE 或查表關聯。

結語

SQL Server 2012 是 T-SQL 語法現代化的分水嶺。Sequence、OFFSET/FETCH、IIF/CONCAT/FORMAT、分析函數,每一項都直擊開發痛點。升級不僅是版本號變化,更是生產力工具箱的豐富。

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