zoukankan      html  css  js  c++  java
  • 两种分页存储过程的写法

    分页对不同的系统要求不同,就其本身来说,可简可繁。但对于数据量比较大的,就得考虑服务器的承载能力和查询效率了,下面两种方法供参考。

    一种是SQL自带的函数实现分页

    代码如:

     ALTER PROCEDURE [dbo].[getPageNum]
        @pageSize int, --页大小
        @pageNum int,   --第几页
        @Where nvarchar(1000)=' where 1=1 '
    AS
        declare @start int, --开始页
                @end int,  --结束页
                @temp nvarchar(1000) --临时的SQL语句
    BEGIN
     
        set @start=@pageSize*(@pageNum-1)+1  --从第几页开始
        set @end=@pageSize*@pageNum          --从第几页结束
        set @temp='select * from(select Number=Row_Number() over (order by ID),* from Users) as A where A.Number between '+convert(varchar(10),@start)+' and '+CONVERT(varchar(10),@end)+' '
        exec(@temp)
    END
     

    另外一种按照自己需要的表,输出相应的总页数和总条数的分页

    代码如下:

    ALTER PROC  [dbo].[thk_up_PageToNum]

    @TableName NVARCHAR(55),--页执行分页的表名字

    @TableIdName NVARCHAR(512), --这个是要查询的表的ID名称

    @TableListName NVARCHAR(1000)=' * ',--要查的列明   

    @SelectWhere NVARCHAR(2000)='',--查询的条件

    @SelectOrderBy NVARCHAR(100)='',   --排序方式                        

       @IndexPage INT=1,--要跳转的页数,第几页                        

             @TopCounts INT =10,  --每个页面多少条数据

    @AllPageCount INT OUTPUT,--总页数    

    @AllCounts INT OUTPUT--总条数         

    AS  

    DECLARE @sqls NVARCHAR(4000)  --先判断是否有条件

    IF(@SelectWhere='')BEGIN

    SET @SelectWhere=' WHERE 1=1 '

    END

    ELSE

    SET @SelectWhere= ' where '+@SelectWhere

    --PRINT @SelectWhere

    --  注意,在拼接字符串的时候,必须要将INT类型的转化为VARCHAR类型的。   

     SET @sqls='SELECT @AllPageCount=CEILING( (COUNT(*)+0.0)/'+CAST(@TopCounts AS varchar)+') FROM '+ @TableName +@SelectWhere                        

       EXEC sp_executesql @sqls,N'@AllPageCount int OUTPUT',@AllPageCount OUTPUT  ---计算总页数的

    --条数

     SET @sqls='SELECT @AllCounts=COUNT(*) FROM '+ @TableName + @SelectWhere                      

        EXEC sp_executesql @sqls,N'@AllCounts int OUTPUT',@AllCounts OUTPUT  ---计算总条数的

    IF(@TableListName='')

    SET @TableListName=' * '

     ---这个是当前页的数据

     IF(@IndexPage=1)

     BEGIN   

    SET @sqls=' SELECT TOP '+CAST(@TopCounts AS varchar)+' '+@TableListName+' FROM  '  +@TableName+@SelectWhere+' '+@SelectOrderBy  --' and '+@TableIdName+' not IN (SELECT TOP ('+CAST(@TopCounts AS varchar)  --+'*('+CAST(@IndexPage AS varchar)+'-1)) '+@TableIdName +' FROM   '+@TableName+@SelectWhere+') '  --+@SelectOrderBy --PRINT @sqls  END  SET @sqls=' SELECT TOP '+CAST(@TopCounts AS varchar)+' '+@TableListName+' FROM  '  +@TableName+@SelectWhere+' and '+@TableIdName+' not IN (SELECT TOP ('+CAST(@TopCounts AS varchar)  +'*('+CAST(@IndexPage AS varchar)+'-1)) '+@TableIdName +' FROM   '+@TableName+@SelectWhere+' '+@SelectOrderBy+') '+@SelectOrderBy

     --PRINT @sqls  

    EXEC(@sqls)  

    --return(@AllCounts)

  • 相关阅读:
    算法总结7—多维缩放
    算法总结3—神经网络
    算法总结9—优化
    算法总结8—非负矩阵因式分解
    R语言系列—区间估计
    算法总结2—决策树分类器
    算法总结5&6k最近邻与聚类
    统计,逻辑与智能
    算法总结4—支持向量机
    R语言系列—回归分析
  • 原文地址:https://www.cnblogs.com/hxbg/p/proc.html
Copyright © 2011-2022 走看看