zoukankan      html  css  js  c++  java
  • 分页存储过程 sql

    说明:

    分页存储过程实现大同小异,主要原理是:按照外部参数(表名,页码,页大小,返回的列 ,返回记录总数,查询条件等)获取相应数据的排序,按照条件约束获取Top N 行,再返回数据。

    在这里我们可以用多种方法实现这个功能。如最简单的方法:

    SELECT * FROM table WHERE 条件 ORDER BY 排序 LIMIT ((页码-1)*页大小),页大小;

    但是大多数这些方法针对数据较小是使用合适,但大数据时就不见的适用。

    此处我们使用一个较为均衡的方法ROW_NUMBER()方法。注:SQLServer2000没有ROW_NUMBER()方法

    SELECT TOP 页大小 * FROM 
    (
        SELECT TOP (页码*页大小) ROW_NUMBER() OVER (ORDER BY 排序条件) AS RowNum, * FROM table WHERE 查询条件
    ) AS tempTable
    WHERE RowNum BETWEEN (页码-1)*页大小+1 AND 页码*页大小
    ORDER BY RowNum

    示例:

    USE [DBName] 
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    create  PROCEDURE [dbo].[_Pagers]
    @tableName nvarchar(255), -- 表名
    @selectFields nvarchar(max) = '*', -- 需要返回的列 
    @pageSize int = 10, -- 页尺寸 
    @pageIndex int = 0, -- 页码 
    @orderField nvarchar(max) = '', -- 排序字段,若为空,则赋值为ID
    @orderType bit = 0, --排序类型(asc=0)
    @condition nvarchar(max) = '' ,-- 查询条件 (注意: 不要加 where) 
    @counts  int  out -- 返回记录总数, 非 0 值则返回 这里作运行后返回的记录总数分页用
    AS 
    set nocount on  --关闭返回计数
    declare @strSQL nvarchar(max) -- 主语句 
    declare @countsQL nvarchar(max)
    declare @rtnCount int
    declare @orderSQL nvarchar(max)
    declare @conditionSQL nvarchar(max)
    declare @tmpTableName nvarchar(max)
    declare @tmpColumnName nvarchar(max)
    set @pageIndex=@pageIndex+1
    if (@orderField <> '')
    begin
    	if(@orderType=0)
    		set @orderSQL=' order by '+@orderField+' ASC desc'
    	else
    		set @orderSQL=' order by '+@orderField+' DESC desc'
    end
    else
    	if(@orderType=0)
    		set @orderSQL=' order by ID ASC'
    	else
    		set @orderSQL=' order by ID DESC'
    
    if @condition <> ''
    	set @conditionSQL = ' where ' + @condition
    else
    	set @conditionSQL = ''
    
    set @countsQL='select @counts=count(*) from  [' + @tableName + ']'+@conditionSQL--获取记录行数
    exec sp_executesql @countsQL, N'@counts int out ',@counts out--执行记录行数查询
    
    --验证分页参数
    if @pageIndex<1 set @pageIndex = 1
    if @pageSize<1 set @pageSize = 10
    --计算要返回的纪录行数
    if @counts < @pageIndex*@pageSize
    	set @rtnCount = @counts-(@pageIndex-1)*@pageSize
    else
    	set @rtnCount = @pageSize
    if @rtnCount < 0 set @rtnCount = 0
    set @tmpTableName='tbl_'+cast(newid() as varchar(36))
    set @tmpColumnName = 'col_'+cast(newid() as varchar(36))
    set @tmpTableName=replace(@tmpTableName,'-','_')
    set @tmpColumnName=replace(@tmpColumnName,'-','_')
    set @strSQL = 'select * from ('
    set @strSQL = @strSQL+ ' select  ROW_NUMBER() OVER('+@orderSQL+') AS rownum,'+@selectFields
    + ' from [' + @tableName +']' + @conditionSQL 
    + ') as t where  rownum between '+str((@pageIndex-1)*@pageSize+1) +' and ' +str(@pageIndex*@pageSize)
    -------------------------End------------------------------------
    exec (@strSQL)--执行查询
    print @strSQL
    set nocount off
    

     

    作者:Mr.Jimmy
    出处:https://www.cnblogs.com/JHelius
    联系:yanyangzhihuo@foxmail.com
    如有疑问欢迎讨论,转载请注明出处

  • 相关阅读:
    第四周作业
    第三周作业
    第二周基础作业
    抓老鼠
    币值转换
    打印沙漏
    秋季学期学习总结
    2019春第七周作业
    2019春第六周作业 学习总结
    第五周作业总结以及学习总结
  • 原文地址:https://www.cnblogs.com/JHelius/p/14318929.html
Copyright © 2011-2022 走看看