SQL Server 2005 對比 2000 改進巨大,本文精選六個最實用、最能提升開發效率的新功能,配合 Northwind 範例資料庫示範。
DECLARE @n INT = 10;
SELECT TOP (@n) * FROM Orders; -- 2000 僅支援常數
應用場景:動態分頁、參數化 Top N 報表。
-- 依 Freight 遞增,取第 20-30 筆
SELECT * FROM (
SELECT OrderID, Freight,
ROW_NUMBER() OVER (ORDER BY Freight) AS rn
FROM Orders
) a
WHERE rn BETWEEN 20 AND 30;
OVER (PARTITION BY ... ORDER BY ...) 可做群組內分頁SELECT * FROM (
SELECT OrderID, Freight,
RANK() OVER (ORDER BY Freight) AS rk
FROM Orders
) a
WHERE rk BETWEEN 20 AND 30;
RANK():並列同名次,下一名次跳號 (1,1,3)DENSE_RANK():並列同名次,下一名次不跳 (1,1,2)NTILE(n):將資料分成 n 桶,標示桶號SET XACT_ABORT ON; -- 確保嚴重錯誤自動回滾
BEGIN TRY
BEGIN TRAN;
INSERT INTO Orders (CustomerID) VALUES (-1); -- 故意違反 FK
COMMIT TRAN;
PRINT 'committed';
END TRY
BEGIN CATCH
ROLLBACK TRAN;
PRINT 'rolled back: ' + ERROR_MESSAGE();
END CATCH
@@ERROR 的時代ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_LINE() 等函數豐富錯誤資訊WITH OrderFreight AS (
SELECT OrderID, Freight,
ROW_NUMBER() OVER (ORDER BY Freight) AS rn
FROM Orders
)
SELECT OrderID, Freight
FROM OrderFreight
WHERE rn BETWEEN 10 AND 20;
WITH OrgChart AS (
SELECT EmployeeID, ManagerID, Title, 0 AS Level
FROM Employees WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.ManagerID, e.Title, Level + 1
FROM Employees e
JOIN OrgChart oc ON e.ManagerID = oc.EmployeeID
)
SELECT * FROM OrgChart ORDER BY Level, EmployeeID;
遞迴 CTE 讓 SQL 輕鬆處理組織架構、BOM 物料清單、遞迴分類等樹狀結構。
CREATE ENDPOINT Orders_Endpoint
STATE = STARTED
AS HTTP (
PATH = '/sql/orders',
AUTHENTICATION = (INTEGRATED),
PORTS = (CLEAR)
)
FOR SOAP (
WEBMETHOD 'CustOrdersOrders' (
NAME = 'Northwind.dbo.CustOrdersOrders'
),
WSDL = DEFAULT,
DATABASE = 'Northwind',
NAMESPACE = 'https://mysite.org/'
);
https://localhost/sql/orders?wsdl 即可取得 WSDL| 功能 | 2000 寫法 | 2005 新寫法 | 效能/維護提升 |
|---|---|---|---|
| TOP N | 常數限制 | 變數/子查詢 | 動態化、參數化 |
| 分頁 | 臨時表 + IDENTITY | ROW_NUMBER() | 單查詢、優化器友善 |
| 排名 | 自聯結/游標 | RANK/DENSE_RANK | 標準 SQL、平行化 |
| 錯誤處理 | @@ERROR 逐行檢查 | TRY-CATCH | 結構化、可讀、可維護 |
| 暫時結果集 | #Temp Table / @Table Var | CTE | 語意清晰、支援遞迴 |
| Web Service | ASP.NET + IIS | CREATE ENDPOINT | 零中介層、部署簡單 |