web-dev-qa-db-ja.com

SQL Serverエラー、「FETCHステートメントでのオプションFIRSTの使用法が無効です。」

2012年以降、SQL Serverのドキュメントは、それらがサポートすることを示しています OFFSET..FETCHLIMITの代わりに使用しようとしています。

以下はPostgreSQLで正常に動作し、結果セットをサンプリングします。

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

しかし、SQL Serverでは、

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

何が起きてる? SQL Serverは標準化されたOFFSET .. FETCHをサポートしていますか?

8
Evan Carroll

SQL Serverは、OFFSET句とFETCH句をORDER BY句の一部として実装しました。これは、他の回答で指摘され、それらのドキュメントに記載されています。

反対側のSQL標準には、これらの句の両方が独立しています。

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

誰かがこの機能を標準に完全に準拠して実装することを望む場合、接続チャネルを通じていつでもSQL Serverチームに要求を出すことができます。実際、MSはコメントしている-オフセットとフェッチに関する別の要求で:

接続アイテム: SQL Denali:合計行カウンターをSELECTステートメントに追加 -by Alexey Rokhin

回答:2010年11月24日11:34にマイクロソフトが投稿

OFFSET/FETCHORDER BYを必要とするという要件は、このリリースの制限です。ANSI SQL標準(SQL:2011)では、新しいOFFSET/FETCH句が提案されています。ORDER BYはオプションです。 SQL Serverの制限は、OFFSETを予約キーワードにしないとオプションの構文を処理できないパーサーテクノロジの制限に関係しています。 将来的には削除される可能性があります。

今に関して...

それまでは、特定のORDER BYなしでOFFSETFETCHを使用したい場合の回避策は、「何もしない」というorder by句を追加することです。例:

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

OFFSET..FETCH に関するドキュメントの最上部で述べたように

OFFSET-FETCH句は、結果セットから結果のウィンドウまたはページのみをフェッチするオプションを提供します。 OFFSET-FETCHは、ORDER BY句でのみ使用できます

...

OFFSETおよびFETCH句を使用するには、ORDER BYが必須です。

そう、

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;

単純なLIMITの場合はそれほど実用的ではありませんが、それが TOP を使用したい場合に適しています。

10
Solomon Rutzky

参照 によると、OFFSET句はSQL ServerのORDER BYの一部です。また、ROWS仕様の後にOFFSETキーワードを追加する必要があります。

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