it-swarm.com.de

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

Ab 2012 zeigen die SQL Server-Dokumente, dass sie OFFSET..FETCH die ich anstelle eines LIMIT verwenden möchte.

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?

8
Evan Carroll

SQL Server hat die Klauseln OFFSET und FETCH als Teil der Klausel ORDER BY 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. Tatsächlich hat MS in einer anderen Anfrage zu Offset und Fetch Folgendes kommentiert:

Verbindungselement: SQL Denali: Zähler für die Gesamtzahl der Zeilen zur Anweisung SELECT hinzufügen - von Alexey Rokhin

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

Die Anforderung , dass OFFSET/FETCHORDER BY Erfordert, ist eine Einschränkung in dieser Version. Im ANSI SQL-Standard (SQL: 2011) ) Wenn die neuen OFFSET/FETCH - Klauseln vorgeschlagen werden, ist ORDER BY 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 OFFSET zu einem reservierten Schlüsselwort zu machen. Wir werden es möglicherweise in Zukunft entfernen.

Nun zu ...

Wenn man bis dahin OFFSET und FETCH ohne einen bestimmten ORDER BY Verwenden möchte, besteht eine Problemumgehung darin, eine Klausel "nichts tun" nach Klausel hinzuzufügen. Beispiel:

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

Wie ganz oben in der Dokumentation zu OFFSET..FETCH angegeben

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 ein einfaches LIMIT, wenn Sie das wollen, sollten Sie sich an TOP halten.

10
Solomon Rutzky

Gemäß der Referenz ist die Klausel OFFSET Teil von ORDER BY in SQL Server. Sie müssen auch das Schlüsselwort ROWS nach der Spezifikation OFFSET hinzufügen:

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