Verwendung von ORDER BY in Views (Sichten) – Teil 1

Immer mal wieder kommt die Frage auf, warum man keine ORDER BY Klausel in Views verwenden darf. Naja, eigentlich eine einfache Frage. Und die Antwort ist auch nicht so schwer.

Nehmen wir mal an, wir haben folgenden View:

CREATE VIEW vwProd AS
SELECT ProductName, UnitPrice
FROM Products

(Ich nutze hier die Northwind Datenbank. Man kann die Beispiele also sehr leicht reproduzieren.)
Natürlich kann man leicht auf die Idee kommen, die Ausgabe des Views immer sortiert nach dem Namen des Produkts anzeigen zu wollen. Fügt man dann am Ende des Befehls ein „ORDER BY ProductName“ hinzu, führt das zu folgendem Fehler:
Nachricht 1033, Stufe 15, Status 1, Prozedur vwProd, Zeile 4 [Batchstartzeile 0]
Die ORDER BY-Klausel ist in Sichten, Inlinefunktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken nur dann gültig, wenn auch TOP, OFFSET oder FROM XML angegeben wird.

Okay. Die ORDER BY-Klausel ist in Sichten also nicht erlaubt. Aber warum? Nehmen wir an, wir wollen den View benutzen. Wir würden die Abfrage schreiben

SELECT ProductName, UnitPrice
FROM vwProd
ORDER BY ProductName

Aha. Da kann man eine ORDER BY-Klausel angeben. Was könnte also passieren, wenn der View ebenfalls eine ORDER BY-Klausel enthält? Die beiden Klausel könnten in Konflikt zueinander stehen. In dem View würde ich ein ORDER BY ProductName angeben, aber in dem SELECT würde ich vielleicht ein ORDER BY UnitPrice angeben. Geht nicht. Um das zu vermeiden ist es nicht erlaubt, innerhalb des View ein ORDER BY anzugeben.