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

Answers:


17

正如其他答案所指出并在其文档中记录的那样,SQL Server已将OFFSETand FETCH子句实现为子句的一部分ORDER BY

另一方面,SQL标准具有以下两个独立的子句:

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

如果有人希望完全符合该标准地实施此功能,则他们总是可以通过Connect通道向SQL Server团队提出请求。实际上,MS已在有关offset和fetch的另一个请求中发表了评论:

连接项目:SQL Denali:将总行计数器添加到SELECT语句中 -作者:Alexey Rokhin

答案:由Microsoft发表于24/11 / 2010,11:34

要求OFFSET/FETCH需要ORDER BY在此版本的限制。OFFSET/FETCH提出新子句的ANSI SQL标准(SQL:2011)中,它ORDER BY是可选的。SQL Server中的限制与我们的解析器技术中的限制有关,解析器技术中的限制不能在不创建OFFSET保留关键字的情况下处理可选语法。我们将来可能会删除它。

现在关于...

在此之前,如果要使用OFFSET并且FETCH没有特定说明ORDER BY,一种解决方法是按子句添加“不执行任何操作”。例:

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

10

..文档顶部所述OFFSETFETCH

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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.