【问题标题】:Error While OFFSET FETCH | SQL SERVEROFFSET FETCH 时出错 | SQL 服务器
【发布时间】:2026-01-04 01:00:01
【问题描述】:

我正在尝试在 SQL SERVER 中进行分页,但在 OFFSET 和 ROWS 上出现两个错误

CREATE PROCEDURE XYZ
@offset int,
@limit int, 
@order char(4),
@Id int
AS
BEGIN
SELECT * FROM TABLE
WHERE ID = @id
ORDER BY 
CASE WHEN @order = 'desc' THEN [TIME] END DESC,
CASE WHEN @order = 'asc' THEN [TIME] END ASC
*OFFSET* @offset FETCH ROWS NEXT @limit *ROWS* ONLY
END
GO

OFFSET 出错:

'OFFSET' 附近的语法不正确。

ROWS 上的错误(第二个):

“ROWS”附近的语法不正确。期待 FROM。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • *OFFSET* @offset FETCH ROWS NEXT @limit *ROWS* ONLY 应该是 OFFSET @offset ROWS FETCH NEXT @limit ROWS ONLY
  • 您的目标是 SQL Server 2012 或更高版本吗?
  • @ZoharPeled 我使用星号来标识我遇到错误的两个关键字。
  • @Damien_The_Unbeliever 好的,我认为问题出在哪里。我正在使用 SQL Server 2008。:|
  • @siddharth 是的,但我的评论是指FETCH ROWS 应该是ROWS FETCH...

标签: sql-server tsql pagination


【解决方案1】:

好吧,在 SQL Server 2008 中,您显然不能使用 2012 年引入的 fetch...next 子句。
但是,这并不意味着您不能进行分页。
一种简单的方法是使用带有 row_number 的 cte:

;WITH CTE AS
(
    SELECT  *,  -- Don't be lazy, specify the Columns list...
            ROW_NUMBER() OVER
            (
                ORDER BY 
                CASE WHEN @order = 'desc' THEN [TIME] END DESC,
                CASE WHEN @order = 'asc' THEN [TIME] END ASC
            ) As rn 
    FROM TABLE
    WHERE ID = @id
)

SELECT * -- Don't be lazy, specify the Columns list...
FROM CTE
WHERE rn >= @offset
AND rn <= @offset + @limit

【讨论】:

    最近更新 更多