sql-server - 我正在使用 fetch 和 offset 运行查询,但对相同的行为感到困惑

标签 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 
,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 存在许多问题,这些问题清楚地表明,虽然它受到基于集合的逻辑的启发,但它并不是严格基于集合的。这似乎是这里的情况,per the documentation ,对 FETCH 使用零值是不正确的。

SQL 在空集方面失败的其他示例包括不允许没有列的表(这在退化情况下可能很有趣)以及不允许声明没有列的(其中表格应包含 0 行或恰好 1 行)1

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


1IIRC,位于 The Third Manifesto Date 和 Darwen 将这些称为 SQL 的一些“无效”错误。其他基于集合的问题包括表和结果集允许有重复的行,因此可能是包而不是集合。

关于sql-server - 我正在使用 fetch 和 offset 运行查询,但对相同的行为感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43649841/

相关文章:

sql-server - 如何将 SQL Server localDB 升级到更新版本?

sql - 从 Excel 导入到 SQL Server : The 'Microsoft.ACE.OLEDB.12.0' provider error

有空格的php yii表列名

SQL:从输出中的父表中选择数据并从两个子表中求和列

sql-server - SSIS - 每个循环中的 OLE Db 目标连接错误

sql-server - ASP.NET/SSAS/SQL Server - 现有连接被远程主机强制关闭

当第二个为空时 SQL 内部连接在一个字段上,当第一个为空时在第二个字段上连接

sql-server - 备份报表的 SQL 数据库

sql - =* 是什么意思?

sql - 将列中的 XML 节点连接到另一个表中的字段