SQL筆記:在VIEW檢視表裡面使用ORDER BY

雖然說在VIEW裡面使用ORDER BY是一種很耗效能且沒有意義的事情,但是還是有非常一大票工程師有這種想法與堅持,敝人也是這個觀點的支持者。總盼望著辛辛苦苦整理出來的檢視表可以在執行輸出的當下,將表格直接按照自己律定好的順序條列排好,這大概是一種工程師的潔癖吧。

SQL的檢視表不可使用ORDER BY排序

當你辛苦地在查詢裡面做好一段包含ORDER BY花式SQL語法,高興地貼到檢視設計視窗(VIEW)執行,SQL會馬上貼心的幫你在SELECT後方加上這段SQL:

SELECT TOP (100) PERCENT ...

這段就是網路盛傳的可以在VIEW裡面使用ORDER BY的神奇關鍵字,其實仔細一看語法就是一段廢話(幫我把100%的資料都撈出),這段指令其實是用來規避語法編譯器的報錯,實際上一點用處都沒有,並不能因為使用了這個關鍵語句就可以真正的讓檢視表排序。

最不爽的是當你確認了指令工作正常後按下儲存,跳出了這個經典的報錯訊息,再一次跟你講不能用就是不能用:

所以你一怒之下打開了ALTER VIEW,想要直接用指令碼強制ORDER BY繞過限制,但SQL會馬上拋出這段更經典的錯誤訊息:

除非同時指定了 TOP 或 FOR XML,否則 ORDER BY 子句在檢視表、內嵌函數、衍生資料表、子查詢及通用資料表運算式中均為無效。

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.

事實上就算你真的想盡辦法繞過檢查把ORDER BY語法寫進去,SQL執行期依然是不會執行ORDER BY的。

那麼,真的沒有辦法了嗎?其實是有的,就是把TOP (100) PERCENT改寫成下列...

SELECT TOP (2147483647) ... --INT32最大值,若結果集超過21億筆數的人請自行斟酌。
SELECT TOP (999999999) ... --常規下若懶得記憶可改使用口訣「九個9」,可接收結果集至10億筆數。

如此一來,SQL檢視表真的會跳過ORDER BY的檢查限制,真正幫你執行排序,但是效能就請自行考慮了。(我猜會搜尋到這篇文章的人應該都不太在乎效能損耗才對...)

註:會想要在VIEW裡面排序的人一定是追求最終的懶惰與精簡,所以關於使用OFFSET指令、包預存程序等讓事情愈發複雜的做法就完全不在考慮範圍了。

SQL SqlView SqlAlterView OrderBy ASC DESC