您的位置:首页 > 其它

项目中的几个常用的分页存储过程

2011-01-12 11:55 323 查看
Create PROCEDURE [dbo].[up_DataPager]

@tblName varchar(255), -- 表名

@fldName varchar(255), -- 排序的字段名,一般为唯一标识

@strGetFields varchar(1000) = ' * ', -- 需要返回的列

@PageSize int = 10, -- 每页有多少条记录

@PageIndex int = 1, -- 第几页

@Count int output, -- 返回记录总数

@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序

@strWhere varchar(1500) = ' 1=1 ' -- 查询条件 (注意: 不要加 where,初始化为1=1使得查询条件永远不为空)

AS

declare @strSQL varchar(5000) -- 主语句

declare @strTmp varchar(110) -- 临时变量

declare @strOrder varchar(400) -- 排序类型

declare @sumsql nvarchar(3000) -- 记录总数

--执行总数统计。

set @sumsql = 'select @Count = count(*) from '+@tblname +' where '+@strwhere

exec sp_executesql @sumsql,N'@Count int output',@Count output-- 纪录总数

--如果@OrderType不是0,就执行降序

if @OrderType != 0

begin

set @strTmp = '<(select min'

set @strOrder = ' order by [' + @fldName +'] desc'

end

else

begin

set @strTmp = '>(select max'

set @strOrder = ' order by [' + @fldName +'] asc'

end

--如果是第一页就执行以下代码,加快执行速度

if @PageIndex = 1

set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '

from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder

else

--以下代码赋予了@strSQL以真正执行的SQL代码 

set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['

+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['

+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['

+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '

+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

exec (@strSQL)

GO

-- =============================================

-- 使用RowNumber分页 SQL Server 2005以上版本

-- 参数

-- {

-- @SQL : 查询语句

-- @Order : 排序字段

-- @CurPage : 当前页

-- @PageRows : 每页大小

-- @TotalRecorder : 记录总数

-- }

-- =============================================

CREATE PROCEDURE [dbo].[up_DataPageRowNumber]

-- Add the parameters for the stored procedure here

@SQL Nvarchar(2000),

@Order Nvarchar(20),

@PageIndex int,

@PageSize int,

@TotalRecorder int output

AS

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from

SET NOCOUNT ON;

declare @ExceSQL nvarchar(4000)

--设置开始行号

declare @start_row_num AS int

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

--设置结束行号

declare @end_row_num int

set @end_row_num = @PageIndex * @PageSize

--设置标识语句

declare @RowNumber nvarchar(100)

set @RowNumber = ', ROW_NUMBER() OVER(ORDER BY ' + @Order + ') as RowNumber from '

set @SQL = Replace(@SQL,' from ',@RowNumber)

--获取记录总数

set @ExceSQL = 'select @TotalRecorder=max(RowNumber) from (' + @SQL + ') as tmp'

execute sp_executesql @ExceSQL,N'@TotalRecorder int output',@TotalRecorder output

--设置查询语句

set @ExceSQL = 'select * from (' + @SQL + ') as tmp where RowNumber between ' + Convert(nvarchar,@start_row_num)

+ ' And ' + Convert(nvarchar, @end_row_num)

execute(@ExceSQL)

END

GO

/*********************************************************

* 作 用:数据分页(完整SQL分页存储过程(支持多表联接))

* 使用说明:

1、单表调用方法:EXEC up_DataPagerCommon @tblName = 'ipa',@fldName = '*',@pageSize =50,@page = 6789,@fldSort = '',@Sort = 1,@strCondition = '',@ID = 'id',@Dist = 0,@pageCount = null,@Counts = NULL

2、多表调用方法:EXEC up_DataPagerCommon @tblName = 'Info LEFT JOIN InfoType it ON it.typeid=Info.tid',@fldName = 'info.*,it.tname',@pageSize =50,@page = 1806,@fldSort = '',@Sort = 0,@strCondition = '',@ID = 'id',@Dist = 0, @pageCount = null,@Counts = NULL

* 多表联合查询使用需注意:1、多表中的主键字段不能为相同的名称。2、多表中不能允许具有相同名称的字段,如果存在相同名称的字段你可以使用AS重命名

*********************************************************/

CREATE PROCEDURE [dbo].[up_DataPagerCommon]

(

@tblName nvarchar(200), ----要显示的表或多个表的连接

@fldName nvarchar(500) = '*', ----要显示的字段列表

@pageSize int = 10, ----每页显示的记录个数

@page int = 1, ----要显示那一页的记录

@fldSort nvarchar(200) = null, ----排序字段列表或条件

@Sort bit = 0, ----排序方法,1为升序,0为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')

@strCondition nvarchar(1000) = null, ----查询条件,不需where

@ID nvarchar(150), ----主表的主键

@Dist bit = 0, ----是否添加查询字段的 DISTINCT 默认0不添加/1添加

@pageCount int = 1 output, ----查询结果分页后的总页数

@Counts int = 1 output ----查询到的记录数

)

AS

SET NOCOUNT ON

Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句

Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句

Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句

Declare @strSortType nvarchar(10) ----数据排序规则A

Declare @strFSortType nvarchar(10) ----数据排序规则B

Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造

Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造

if @Dist = 0

begin

set @SqlSelect = 'select '

set @SqlCounts = 'Count(0)'

end

else

begin

set @SqlSelect = 'select distinct '

set @SqlCounts = 'Count(DISTINCT '+@ID+')'

end

if @Sort=0

begin

set @strFSortType=' DESC '

set @strSortType=' DESC '

end

else

begin

set @strFSortType=' ASC '

set @strSortType=' ASC '

end

if(@fldSort is not null and @fldSort<>'')

begin

set @fldSort=','+@fldSort

end

else

begin

set @fldSort=' '

end

--------生成查询语句--------

--此处@strTmp为取得查询结果数量的语句

if @strCondition is null or @strCondition='' --没有设置显示条件

begin

set @sqlTmp = @fldName + ' From ' + @tblName

set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName

set @strID = ' From ' + @tblName

end

else

begin

set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition

set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition

set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition

end

----取得查询结果总数量-----

exec sp_executesql @strTmp,N'@Counts int out ',@Counts out

declare @tmpCounts int

if @Counts = 0

set @tmpCounts = 1

else

set @tmpCounts = @Counts

--取得分页总数

set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize

/**//**当前页大于总页数 取最后一页**/

if @page>@pageCount

set @page=@pageCount

--/*-----数据分页2分处理-------*/

declare @pageIndex int --总数/页大小

declare @lastcount int --总数%页大小

set @pageIndex = @tmpCounts/@pageSize

set @lastcount = @tmpCounts%@pageSize

if @lastcount > 0

set @pageIndex = @pageIndex + 1

else

set @lastcount = @pagesize

--为配合显示

--set nocount off

--select @page curpage,@pageSize pagesize,@pageCount countpage,@tmpCounts [Rowcount]

--set nocount on

--//***显示分页

if @strCondition is null or @strCondition='' --没有设置显示条件

begin

if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理

begin

if @page=1

set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName

+' order by '+ @ID+' '+ @strFSortType+@fldSort

else

begin

set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName

+' where '+@ID

if @Sort=0

set @strTmp = @strTmp + '>(select max('

else

set @strTmp = @strTmp + '<(select min('

set @strTmp = @strTmp + @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName

+' order by '+ @ID+' '+ @strFSortType+@fldSort+') AS TBMinID)'

+' order by '+ @ID+' '+ @strFSortType+@fldSort

end

end

else

begin

set @page = @pageIndex-@page+1 --后半部分数据处理

if @page <= 1 --最后一页数据显示

set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(40))+' '+ @fldName+' from '+@tblName

+' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort

else

begin

set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName

+' where '+@ID

if @Sort=0

set @strTmp=@strTmp+' <(select min('

else

set @strTmp=@strTmp+' >(select max('

set @strTmp=@strTmp+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName

+' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TBMaxID)'

+' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort

end

end

end

else --有查询条件

begin

if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理

begin

if @page=1

set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName

+' where 1=1 ' + @strCondition + ' order by '+ @ID+' '+ @strFSortType+@fldSort

else

begin

set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName

+' where '+@ID

if @Sort=0

set @strTmp = @strTmp + '>(select max('

else

set @strTmp = @strTmp + '<(select min('

set @strTmp = @strTmp + @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName

+' where (1=1) ' + @strCondition +' order by '+ @ID+' '+ @strFSortType+@fldSort+') AS TBMinID)'

+' '+ @strCondition +' order by '+ @ID+' '+ @strFSortType+@fldSort

end

end

else

begin

set @page = @pageIndex-@page+1 --后半部分数据处理

if @page <= 1 --最后一页数据显示

set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(40))+' '+ @fldName+' from '+@tblName

+' where (1=1) '+ @strCondition +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort

else

begin

set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(40))+' '+ @fldName+' from '+@tblName

+' where '+@ID

if @Sort=0

set @strTmp = @strTmp + '<(select min('

else

set @strTmp = @strTmp + '>(select max('

set @strTmp = @strTmp + @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName

+' where (1=1) '+ @strCondition +' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TBMaxID)'

+' '+ @strCondition+' order by '+ @ID +' '+ @strSortType+@fldSort+') AS TempTB'+' order by '+ @ID+' '+ @strFSortType+@fldSort

end

end

end

------返回查询结果-----

SET NOCOUNT off

exec sp_executesql @strTmp

print @strTmp

GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: