【问题标题】:Pagination in SQL Server 2012 stored procedure with top distinct(x) recordsSQL Server 2012 存储过程中的分页与顶部不同(x)记录
【发布时间】:2015-11-09 15:08:12
【问题描述】:

我想创建带有分页的存储过程以及前 100 个表的子集。例如,在具有超过 3,000,000 条记录的表(例如:employee 表)中,我想获取前 100,000 条记录并进行分页。我可以使用以下脚本进行分页,但我想获取前 100,000 条记录并进行分页。

DECLARE @currentPageNo int,@takeData int
SET @currentPageNo =1
SET @takeData = 10

SELECT DISTINCT emp.empid,emp.name,s.Salary,
FROM Employee emp 
LEFT OUTER JOIN salary S ON emp.empid=S.empid
where emp.empid=12
ORDER BY emp.empid desc
OFFSET (@currentPageNo - 1) *   @takeData  ROWS
 FETCH NEXT   @takeData  ROWS ONLY  

我需要一些关于如何实现这一点的建议。我正在使用 SQL Server 2012。

【问题讨论】:

  • 不是每个人都了解印度 (?) 编号系统,因此您应该编辑您的问题并将 lackcrore 替换为正确的英文术语或数字。
  • 这个问题没有多大意义。最缺的是什么?
  • @JulienVavasseur 它是十万或十万。它是印度编号系统的一部分。 en.wikipedia.org/wiki/Lakh
  • 我首先尝试阅读并理解这个问题,因为它已被礼貌地回复给 Tab Alleman。 Jpw 建议用适当的解释或每个人都可以理解的术语来编辑问题。什么都没做。事实上,这意味着什么并不明显,应该在问题中正确解释。

标签: sql-server tsql stored-procedures


【解决方案1】:

为了正确执行分页,您需要确保结果集的顺序并分配行号,为此您可以使用 ROWNUMBER() OVER()

您还需要知道整个结果集的总数。这将告诉您总共有多少页。您可以在辅助查询中执行此操作,或使用 COUNT() OVER() 为 Total Rows 添加另一列

这是一个使用变量的示例:

DECLARE @currentPageNo int,@takeData int
SET @currentPageNo =0
SET @takeData = 10  

  SELECT TOP(@currentPageNo) * FROM
    (
                SELECT  ROW_NUMBER() OVER(ORDER BY [ColumnName]) RowNumber, *
                FROM (

                    SELECT DISTINCT emp.empid,emp.name,s.Salary,COUNT(emp.empid) OVER() TotalRows
                    FROM Employee emp 
                    LEFT OUTER JOIN salary S ON emp.empid=S.empid
                    where emp.empid=12
                ) Q1        
    ) Q2
    WHERE ( @takeData<>0 AND RowNumber BETWEEN ((@currentPageNo * @takeData) + 1) AND ((@currentPageNo +1) * @takeData))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2011-08-10
    • 2018-04-17
    相关资源
    最近更新 更多