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)

  • 相关阅读:
    cocos2d-x笔记5: 通过jni实现C++调用Java
    cocos2d-x笔记4: TextField不能删除内容,以及我的解决办法。。。
    C++ 11 笔记 (六) : 随机数
    C++ 11 笔记 (五) : std::thread
    C++ 11 笔记 (四) : std::bind
    C++ 11 笔记 (三) : auto
    C++ 11 笔记 (二) : for循环
    要做的题目
    【C补充】结构体的内存分配,匈牙利命名法
    【C补充】文件操作
  • 原文地址:https://www.cnblogs.com/hxbg/p/proc.html
Copyright © 2011-2022 走看看