SQL Server 不允許在視圖定義中直接使用 ORDER BY 子句,這是為了遵循 ANSI SQL-92 標準。標準認為視圖是一個虛擬表,表本身無序,順序應由查詢視圖時的外層 ORDER BY 決定。
SQL Server 7.0 引入的 TOP 結構提供了變通方法:**只有配合 TOP 關鍵字時,才允許在視圖中使用 ORDER BY**。
USE pubs
GO
CREATE VIEW AuthorsByName
AS
SELECT TOP 100 PERCENT *
FROM authors
ORDER BY au_lname, au_fname
GO
TOP 100 PERCENT 表示返回所有行,實現「全量排序」的效果TOP 是 SQL Server 對 ANSI SQL-92 的擴展語法TOP 100 PERCENT ... ORDER BY 可能導致查詢優化器產生不必要的排序操作,影響性能ORDER BY**,而非寫死在視圖定義中
-- 推薦:調用時排序
SELECT * FROM AuthorsByName ORDER BY au_lname, au_fname;
OFFSET ... FETCH 替代 TOP 實現分頁雖然可通過 TOP 100 PERCENT 繞過限制,但**最佳實踐是視圖定義不包含排序,由調用方控制順序**;這樣更符合關係模型本質,也便於優化器生成最優計劃。