web-dev-qa-db-ja.com

FETCHステートメントでのオプションNEXTの無効な使用を解決する方法

SQL Server 2008でjtds 1.2.2ドライバーを使用しています。以下は、実行しようとしたクエリです。

SELECT * from AM_API  FETCH NEXT 10 ROWS ONLY

とにかく、上記のクエリを実行した後、エラーが発生しました

Caused by: Java.sql.SQLException: Invalid usage of the option NEXT in the FETCH statement.
    at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.Java:368)
    at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.Java:2816)
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.Java:2254)
    at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.Java:631)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.Java:477)
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.Java:777)
    at org.jaggeryjs.hostobjects.db.DatabaseHostObject.executeQuery(DatabaseHostObject.Java:510)

この問題を解決する方法はありますか?

[〜#〜]更新[〜#〜]

私は this を読みましたが、FETCHはSQL Server 2012以降でのみ機能します。次に、SQL Server 2008で結果を制限する方法を示します。実行されるクエリは、私の制御下にありません。後付けしただけですFETCH NEXT 10 ROWS ONLYをクエリに追加して、結果を制限します。そのため、クエリに接尾辞として制限クエリを追加することによって結果を制限する方法があります。

1
lakshman

SQL Server 2012にアップグレードすると問題は解決しますが、同じエラーが発生します。 ドキュメント から:

OFFSET-FETCHの使用に関する制限:

  • OFFSETおよびFETCH句を使用するには、ORDER BYが必須です。
  • OFFSET句はFETCHでは必須です。 ORDER BY…FETCHは使用できません。

SQL Server 2012でこれを行うと、テーブルから非決定的な10行を返すことができます。

SELECT * 
FROM AM_API
ORDER BY (SELECT NULL) OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;

アップグレードできない場合は、いくつかの追加オプションがあります。 SET ROWCOUNTSELECTステートメントでは非推奨ではないため、SQL Server 2008では次のように機能します。

SET ROWCOUNT 10;

SELECT * 
FROM AM_API;

SET ROWCOUNT 0;

TOP式を使用することもできます。

SELECT TOP 10 * 
FROM AM_API;
4
Joe Obbish