【总结★分页存储过程】几种分页存储过程

一、使用Max/Min子查询:  

View Code

经测试,如果排序字段数据相同,则取出的数据不正确

二、使用Not In 子查询:

View Code
ALTER PROCEDURE [dbo].[Proc_Pager]
@TableName nvarchar(255), -- 表名如:'xtest'
@FieldName nvarchar(1000) = '*', -- 需要返回的列如:'xname,xdemo'
@PKName nvarchar(50)='ID', -- 主键名
@OrderField nvarchar(255)='', -- 排序的字段名如:'order by id desc'
@strWhere nvarchar(1500) = '', -- 查询条件(注意:不要加where)如:'xname like ''%222name%'''
@pageIndex int = 1, -- 页码如:2
@pageSize int = 20, -- 每页记录数如:20
@IsReturnCount bit=0 -- 非0则统计,为0则不统计(统计会影响效率)
AS

Declare @sql nvarchar(4000)
Declare @sqltemp nvarchar(1000)

set @sql=' From '+@TableName
set @strWhere=' Where 1=1 '+@strWhere
set @sql=@sql+@strWhere

if(@OrderField!='') set @OrderField=' order by '+@OrderField

--if @strWhere !='' set @strWhere=' where 1=1 '+@strWhere

if (@PageIndex>1)
begin
set @sqltemp=@PKName+' not in (Select Top '+cast((@PageSize*(@PageIndex-1)) as nvarchar)+' '+@PKName+' '+@sql
if(@OrderField!='')
set @sqltemp=@sqltemp+' '+@OrderField
set @sqltemp=@sqltemp+')'
set @sql='Select Top '+cast(@PageSize as nvarchar)+' '+@FieldName+' '+@sql
set @sql=@sql+' And '+@sqltemp
end
else
set @sql='Select Top '+cast(@PageSize as nvarchar)+' '+@FieldName+' '+@sql

if(@OrderField!='')
set @sql=@sql+' '+@OrderField



if(@IsReturnCount!=0)
set @sql=@sql+'select count(1) from '+ @TableName + @strWhere

exec(@sql)

页码较大时,效率相对较低,数据量不大的话,也不太要紧,当然可以在此基础上做进一步的优化

三、使用Row_num:

首先,row_num 是从SQL2000开始新增的属性,所以仅适用与sql2005+

View Code
CREATE PROCEDURE [dbo].[Proc_Pager]

@Tables nvarchar(max),            --表名,支持多表

@Fields nvarchar(max)='*',        --返回字段

@Order nvarchar(max)='',        --排序字段(需要加desc asc),支持多列排序

@PageSize int,                    --页大小

@PageIndex int,                    --页索引

@Condition nvarchar(max)=''        --查询条件(不加Where,以and开头)

AS



DECLARE @Sql nvarchar(max)

declare @StartIndex int

declare @EndIndex int



SET @Order = ' order by ' + @Order

SET @StartIndex=@PageSize*(@PageIndex-1)+1

set @EndIndex=@PageSize*(@PageIndex)

if @condition is null

    set @condition=''

SET @Condition=' Where 1=1 '+@Condition    

    

SET @Sql='Select * From (Select Row_Number() Over('+@Order+') as RowIndex,'+@Fields+' From '+@Tables+@Condition+') TempTable Where RowIndex Between '+cast(@StartIndex as nvarchar)+' And '+cast(@EndIndex as nvarchar)



EXEC (@Sql)

 

总结

随着SQL05 08以及更高版本的普及,分页存储过程的讨论已经逐渐成为历史,05+可以使用row_num轻松的实现分页查询

 

 

你可能感兴趣的:(存储过程)