Sql server 我正在使用fetch和offset运行一个查询,但与相同的行为相混淆

Sql server 我正在使用fetch和offset运行一个查询,但与相同的行为相混淆,sql-server,Sql Server,我很困惑,因为空集合也是集合,这是真的! 但是当我执行一个查询时,比如 SELECT FirstName ,LastName ,EmailPromotion FROM person.Person ORDER BY LastName desc OFFSET 0 ROW FETCH FIRST 0 ROW ONLY 这是一个错误 为FETCH子句提供的行数必须大于零 同时当我执行这样的查询时 DECLARE @n AS BIGINT = 0; SELECT FirstName ,LastName

我很困惑,因为空集合也是集合,这是真的! 但是当我执行一个查询时,比如

SELECT FirstName
,LastName 
,EmailPromotion
FROM person.Person
ORDER BY LastName desc
OFFSET 0 ROW FETCH FIRST 0 ROW ONLY
这是一个错误 为FETCH子句提供的行数必须大于零

同时当我执行这样的查询时

DECLARE @n AS BIGINT = 0;
SELECT FirstName
,LastName 
,EmailPromotion
FROM person.Person
ORDER BY LastName desc
OFFSET @n ROW FETCH FIRST @n ROW ONLY
这又是一个错误 为FETCH子句提供的行数必须大于零

但当我执行这样的查询时,它不会给出任何错误,并且正确地生成一个空集

DECLARE @n AS BIGINT = 0;
SELECT FirstName
,LastName 
,EmailPromotion
FROM person.Person
ORDER BY LastName desc
OFFSET 0 ROW FETCH FIRST @n ROW ONLY

为什么有人能解释这种行为呢?

SQL有很多问题,它们清楚地表明,虽然它是受基于集合的逻辑启发的,但它不是严格地基于集合的。这里的情况似乎是这样的,在
FETCH
中使用零值是不正确的

SQL与空集有关的其他示例包括不允许没有列的表(这可能是有趣的退化情况)以及不允许声明没有列的键(其中表应包含0行或正好包含1行)1

所以,虽然我们可以说空集很有趣,但这并不一定意味着SQL将帮助您生成它们。您发现的情况似乎允许它发生,这更像是“欺骗优化器”,而不是生产代码中应该依赖的东西



1IRC、in Date和Darwen将这些错误称为SQL的一些“空逻辑”错误。其他基于集合的问题包括允许表和结果集有重复的行,因此可能是包而不是集合。

您在这里实际想做什么<代码>偏移量允许您跳过一些初始记录(由排序定义)
FETCH FIRST
看起来像DB2,而不是SQL Server,后者使用
FETCH NEXT
@TimBiegeleisen-SQL Server支持@Damien_和@Damien_这两个方面,我对大多数RDBMS中的最新扩展一无所知…感谢链接,正在阅读。@TimBiegeleisen您可以同时使用next和first,这取决于您自己,但只是为了方便起见,如果要偏移0行,则应使用fetch next。sql server支持“下一步”和“第一步”。@TimBiegeleisen Exaclty fetch nothing意味着获取一个空集,那么为什么它的给定错误是“尝试获取某个东西”而您什么也不获取。但是它不应该用于此查询,也应该将@n声明为BIGINT=0;选择FirstName、LastName、EmailPromotion FROM person。person订单按LastName描述偏移量0行仅获取FIRST@n行