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

體驗 SQL Server 2005 T-SQL 新特性:TRY...CATCH 異常處理與 ROW_NUMBER() 分頁神器

     編輯:關於SqlServer

告別 `@@ERROR` 條件判斷,擁抱結構化異常處理與集合式分頁

一、TRY...CATCH:現代化錯誤處理

BEGIN TRY
    BEGIN TRANSACTION;
    INSERT INTO Orders (CustomerID, OrderDate) VALUES (1, GETDATE());
    INSERT INTO OrderDetails (OrderID, ProductID, Qty) VALUES (SCOPE_IDENTITY(), 10, 2);
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
    SELECT 
        ERROR_NUMBER() AS ErrNo,
        ERROR_SEVERITY() AS Severity,
        ERROR_STATE() AS State,
        ERROR_PROCEDURE() AS ProcName,
        ERROR_LINE() AS LineNo,
        ERROR_MESSAGE() AS Msg;
    -- 可選:INSERT INTO ErrorLog ... ; THROW; (2012+)
END CATCH;
  • **嚴重性 ≥ 11** 的錯誤才會進入 CATCH (含 11-16 使用者可修正、17-19 系統/資源、20+ 致命)。
  • 可巢狀 `TRY/CATCH`,外層捕捉內層未處理錯誤。
  • 取代舊式 `IF @@ERROR <> 0 GOTO ErrHandler` 蝇營狗苟碼。

二、ROW_NUMBER():分頁/排序/去重 一行搞定

-- 分頁 (第 2 頁,每頁 10 筆)
WITH Numbered AS (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY OrderDate DESC) AS RN,
        OrderID, CustomerID, OrderDate, TotalAmount
    FROM Orders
)
SELECT * FROM Numbered WHERE RN BETWEEN 11 AND 20;

-- 去重 (保留每組最新一筆)
WITH Ranked AS (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY OrderDate DESC) AS RN,
        *
    FROM Orders
)
DELETE FROM Ranked WHERE RN > 1;
  • `OVER (ORDER BY ...)` 定義排序依據,`PARTITION BY` 定義分組。
  • **效能遠優於舊式暫存表 + IDENTITY / 游標 / 相關子查詢** 分頁法。
  • 配合 `OFFSET/FETCH` (2012+) 更簡潔:`ORDER BY OrderDate DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY`。

其他 2005 T-SQL 亮點

  • `TRY_CONVERT` / `TRY_CAST` / `TRY_PARSE` (2012+) 安全轉型。
  • `PIVOT` / `UNPIVOT` 行轉列/列轉行。
  • `CROSS APPLY` / `OUTER APPLY` 表值函數聯結。
  • `MAX` / `MIN` / `SUM` / `AVG` `OVER()` 窗口彙總。
  • `xml` 資料型別、XQuery/XPath 原生支援。

結語

**TRY/CATCH + ROW_NUMBER() = T-SQL 寫碼品質的分水嶺**。2005 之後的專案**零理由繼續用 `@@ERROR` / 暫存表分頁**,升級語法即享受可讀、可維護、高效能的現代 T-SQL。

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