如何解决 FETCH 语句中选项 NEXT 的无效使用

lak*_*man 2 sql-server-2008 sql-server jdbc

我在 SQL Server 2008 中使用 jtds 1.2.2 驱动程序。下面是我尝试执行的查询

SELECT * from AM_API  FETCH NEXT 10 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

无论如何,在执行上述查询后,我得到以下错误

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)
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个问题吗?

更新

我读过这篇文章,说 FETCH 仅适用于 SQL Server 2012 以上。那么如何在SQL server 2008 中限制结果。要执行的查询不在我的控制之下。我只是后缀FETCH NEXT 10 ROWS ONLY到查询以限制结果。那么有没有办法通过添加限制查询作为查询的后缀来限制结果。

Joe*_*ish 6

升级到 SQL Server 2012 会有所帮助,但您仍会遇到相同的错误。从文档

使用 OFFSET-FETCH 的限制:

  • ORDER BY 必须使用 OFFSET 和 FETCH 子句。
  • FETCH 必须使用 OFFSET 子句。您永远不能使用 ORDER BY ... FETCH。

要从表中返回不确定的 10 行,您可以在 SQL Server 2012 中执行此操作:

SELECT * 
FROM AM_API
ORDER BY (SELECT NULL) OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

如果您无法升级,您还有一些额外的选择。SET ROWCOUNT不推荐用于SELECT语句,因此以下内容应该适用于 SQL Server 2008:

SET ROWCOUNT 10;

SELECT * 
FROM AM_API;

SET ROWCOUNT 0;
Run Code Online (Sandbox Code Playgroud)

您还可以使用 TOP 表达式:

SELECT TOP 10 * 
FROM AM_API;
Run Code Online (Sandbox Code Playgroud)