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