Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2012存储过程中具有顶部不同(x)记录的分页_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql server SQL Server 2012存储过程中具有顶部不同(x)记录的分页

Sql server SQL Server 2012存储过程中具有顶部不同(x)记录的分页,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我想创建带有分页的存储过程,以及针对表子集的TOP100。例如,在一个包含300多万条记录的tablex:employee表中,我希望获取前10万条记录并进行分页。我可以使用下面的脚本进行分页,但我想获取前100000条记录并进行分页 DECLARE @currentPageNo int,@takeData int SET @currentPageNo =1 SET @takeData = 10 SELECT DISTINCT emp.empid,emp.name,s.Salary, FROM

我想创建带有分页的存储过程,以及针对表子集的TOP100。例如,在一个包含300多万条记录的tablex:employee表中,我希望获取前10万条记录并进行分页。我可以使用下面的脚本进行分页,但我想获取前100000条记录并进行分页

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。

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

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

下面是一个使用变量的示例:

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))

并不是每个人都理解印度的编号系统,所以你应该编辑你的问题,用正确的英语术语或数字来代替lack和crore。这个问题的可能重复没有多大意义。最缺的是什么?@julienvasseur是10万还是10万。它是印度编号系统的一部分。我首先试着阅读和理解这个问题,因为它已经被礼貌地回答了塔布阿勒曼。Jpw建议编辑问题,并提供适当的解释或大家都能理解的术语。什么也没做。事实上,这意味着什么并不明显,应该在问题中加以适当解释。