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


8

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

以下は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か?

回答:


17

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

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

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

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

接続項目:SQLデナリ:合計行カウンターをSELECTステートメントに追加 -Alexey Rokhin

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

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

今に関して...

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

SELECT 
...
ORDER BY (SELECT NULL)
OFFSET 0 ROWS
FETCH NEXT 1 ROWS ONLY;

10

一番上に述べたようにドキュメント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


9

リファレンスによると、このOFFSET句はORDER BYSQL Serverの一部です。またROWSOFFSET仕様の後にキーワードを追加する必要があります。

SELECT *
FROM ( VALUES (1),(2),(3) ) AS t(x)
ORDER BY x
OFFSET 0 ROWS
FETCH FIRST 1 ROWS ONLY;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.