SQL Server查询分页

时间:2016-07-06 18:37:32

标签: sql sql-server

我得到了简单的SQL Server查询:

SELECT TOP 100 
    [ID], [SUMMARY], [NAME]   
FROM 
    [db_test].[dbschema].[dborders]

它工作正常,并从表中查询100条记录,现在我需要让分页机制让我说出10首记录:

SELECT TOP 10 
FROM 
    (SELECT TOP 100 
         [ID], [SUMMARY], [NAME]   
     FROM 
         [db_test].[dbschema].[dborders])

但是我收到了错误:

  

第15行,第1行,第1行,第1行   关键字' FROM'。

附近的语法不正确

请告诉我我做错了什么,或者给我一些正确陈述的例子。

4 个答案:

答案 0 :(得分:3)

您的查询有两个语法错误和一个逻辑错误:

  • *
  • 中缺少SELECT(或列列表)
  • 缺少子查询的表别名
  • ORDER BY,应与TOP
  • 一起使用

所以:

SELECT TOP 10 o.*
FROM (SELECT TOP 100 [ID], [SUMMARY], [NAME]
      FROM [db_test].[dbschema].[dborders] o
      ORDER BY id
     ) o
ORDER BY id;

如果不使用ORDER BY,则无法保证SQL Server每次运行查询时都返回相同的结果。在进行分页时,有一个稳定的排序顺序很重要。

答案 1 :(得分:3)

对于SQL Server 2012分页,请查看关键字OFFSET和FETCH。

OFFSET是起始行。对于第一页,OFFSET为零。如果您每页显示10个项目,则第二个页面将以OFFSET 10开头。

FETCH是要返回的行数,就像使用TOP时一样。

NSInteger

答案 2 :(得分:1)

发生语法错误,因为您没有对子查询进行别名。您必须命名要从中选择的对象。

SELECT TOP 10 * FROM (
    SELECT TOP 100 [ID] ,[SUMMARY] ,[NAME]   FROM [db_test].[dbschema].[dborders] A ORDER BY id
)AS B ORDER BY ID

另外,正如techspider指出的那样,您将获得的第一个错误是由于缺少列列表而导致的第二个错误将来自缺少的子查询别名。

另一点是,有更多优化的方法可以在存储过程中实现分页。但是,这回答了有关语法错误的原始问题。

答案 3 :(得分:0)

如果您的MS SQL Server在2012之前,那么您可以使用row_number()进行分页。这是一个样本。

declare @startRow int=20, @rowsPerPage int = 10 --or receive as SP parameters

;with cte as (--start CTE
   SELECT [ID], [SUMMARY], [NAME],
      row_number() over(order by id) rn --enumerate rows
   FROM [db_test].[dbschema].[dborders]
)--end CTE
select [ID], [SUMMARY], [NAME]
from cte
where rn between @startRow and @startRow + @rowsPerPage