SQL Server-Fehler: "Ungültige Verwendung der Option FIRST in der FETCH-Anweisung."

8

Ab 2012 zeigen die SQL Server-Dokumente, dass sie unterstützen, OFFSET..FETCHdie ich anstelle von a verwenden möchte LIMIT.

Das Folgende funktioniert gut in PostgreSQL, um eine Ergebnismenge abzutasten:

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;

Mit SQL Server bekomme ich jedoch

Msg 153, Level 15, State 2, Line 4
Invalid usage of the option FIRST in the FETCH statement.

Was ist denn hier los? Unterstützt SQL Server das standardisierte OFFSET.. FETCH?

Evan Carroll
quelle

Antworten:

17

SQL Server hat die Klauseln OFFSETund FETCHals Teil der ORDER BYKlausel implementiert , wie in den anderen Antworten angegeben und in ihrer Dokumentation dokumentiert.

Der SQL-Standard auf der anderen Seite hat beide Klauseln als unabhängig:

<query expression> ::=
[ <with clause> ] <query expression body>
[ <order by clause> ] [ <result offset clause> ] [ <fetch first clause> ]

Wenn jemand möchte, dass diese Funktion in voller Übereinstimmung mit dem Standard implementiert wird, kann er jederzeit über den Connect-Kanal eine Anfrage an das SQL Server-Team senden. In der Tat hat MS kommentiert - in einer anderen Anfrage über Offset und Fetch:

Verbindungselement: SQL Denali:SELECT Fügen Sie der Anweisung einen Gesamtzeilenzähler hinzu - von Alexey Rokhin

Antwort: Gepostet von Microsoft am 24/11/2010 um 11:34

Die Forderung , die OFFSET/FETCHerfordert ORDER BYist eine Einschränkung in dieser Pressemitteilung. Im ANSI SQL-Standard (SQL: 2011), in dem die neuen OFFSET/FETCHKlauseln vorgeschlagen werden, ORDER BYist dies optional. Die Einschränkung in SQL Server hat mit Einschränkungen in unserer Parser-Technologie zu tun, die die optionale Syntax nicht verarbeiten können, ohne OFFSETein reserviertes Schlüsselwort zu erstellen. Wir können es in Zukunft entfernen.

Nun zu ...

Bis dahin , wenn man verwenden möchte OFFSETund FETCHohne eine bestimmte ORDER BY, ist eine Behelfslösung ein „nichts tun“ order by - Klausel hinzuzufügen. Beispiel:

SELECT 
...
ORDER BY (SELECT NULL)
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;
ypercubeᵀᴹ
quelle
10

Wie ganz oben in der Dokumentation zu OFFSET..FETCH

Die OFFSET-FETCH-Klausel bietet Ihnen die Möglichkeit, nur ein Fenster oder eine Ergebnisseite aus der Ergebnismenge abzurufen. OFFSET-FETCH kann nur mit der ORDER BY-Klausel verwendet werden.

...

ORDER BY ist obligatorisch, um die OFFSET- und FETCH-Klausel zu verwenden.

Damit,

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY t.[x]  /* <-- ADD ME TO BE HAPPY */
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;

Nicht so praktisch für einen einfachen, LIMITwenn es das ist, was Sie wollen, bleiben Sie dabei TOP.

Solomon Rutzky
quelle
9

Gemäß der Referenz ist die OFFSETKlausel Teil von ORDER BYSQL Server. Sie müssen das ROWSSchlüsselwort auch nach der OFFSETSpezifikation hinzufügen :

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY x
OFFSET 0 ROWS
FETCH FIRST 1 ROWS ONLY;
Dan Guzman
quelle