分页存储过程(经典)
参数:@PK varchar(50),
主键,用来排序的单一字段,空的话,表示没有主键,存储过程将自动创建标识列主键
@Fields varchar(500), 要显示的字段列表(格式如:ID,Code,Name)i2B7Mdia U Q3lQ
@Tables varchar(1000), 要使用的表集合(Org)9p;Jp+Mj-Q
@Where varchar(500), 查询条件(Code like '100')s;K C{4z&N
@OrderBy varchar(100), 排序条件(支持多个排序字段,如:ID,Code desc,Name desc)z7NL| p
@PageIndex int, 当前要显示的页的页索引,索引从1开始,无记录时为0。
@PageSize int, 页大小c(E2F;K`
创建者:Hollis Yao
创建日期:2006-08-06.eCu4G:Pc7qo
备注:
*/
CREATE PROCEDURE [dbo].[listpage]5~)}-Hux
@PK varchar(50)='',
@Fields varchar(500),
@Tables varchar(1000),9gb+qCe f
@Where varchar(500)='',{$uNG+}` _ I
@OrderBy varchar(100),
@PageIndex int,
@PageSize int
AS&F3U9X'jPw},U j
--替换单引号,避免构造SQL出错0vG9i9A BK/tb
set @Fields = replace(@Fields, '''', '''''')
--要执行的SQL,切分为几个字符串,避免出现长度超过4k时的问题
declare @SQL1 varchar(4000)m9J_n8u$^
declare @SQL2 varchar(4000)
if @PageIndex=0,pM5XCmL+D Ce
set @PageIndex = 1
set @SQL1 = ''P$\Z$_6N-K#z
set @SQL2 = ''(^^*H!^+].q1O
if @Where is not null and len(ltrim(rtrim(@Where))) > 0S[@y8G!P t
set @Where = ' where ' + @WhereCxLC*j],y$p7Z
else,FIgyUL F;{ WBp
set @Where = ' where 1=1'
set @SQL1 = @SQL1 + ' declare @TotalCount int' --声明一个变量,总记录数7M0W/Lq5s/^!|/?f
set @SQL1 = @SQL1 + ' declare @PageCount int' --声明一个变量,总页数5`b2wde/v8Z B_
set @SQL1 = @SQL1 + ' declare @PageIndex int' --声明一个变量,页索引U.m(L)|B(S-A]Y
set @SQL1 = @SQL1 + ' declare @StartRow int' --声明一个变量,当前页第一条记录的索引
set @SQL1 = @SQL1 + ' select @TotalCount=count(*) from ' + @Tables + @Where --获取总记录数4h r:w O/o3{$JZ4u
set @SQL1 = @SQL1 + ' if @PageCount <= 0 begin' --如果记录数为0,直接输出空的结果集
set @SQL1 = @SQL1 + ' select ' + @Fields + ' from ' + @Tables + ' where 1<>1'
set @SQL1 = @SQL1 + ' select 0 as PageIndex,0 as PageCount,'
+ convert(varchar, @PageSize) + ' as PageSize,0 as TotalCount'| c;@7S%u_)qo*bM
set @SQL1 = @SQL1 + ' return end'
set @SQL1 = @SQL1 + ' set @PageCount=(@TotalCount+' + convert(varchar, @PageSize)
+ '-1)/' + convert(varchar, @PageSize) --获取总页数
set @SQL1 = @SQL1 + ' set @PageIndex=' + convert(varchar, @PageIndex)
--设置正确的页索引
set @SQL1 = @SQL1 + ' if @PageIndex<0 set @PageIndex=1'0];P X8YeauC%Cp
set @SQL1 = @SQL1 + ' if @PageIndex>@PageCount and @PageCount>0 2@`zK~n
set @PageIndex=@PageCount'
set @SQL1 = @SQL1 + ' set @StartRow=(@PageIndex-1)*' + convert(varchar, @PageSize)8wEDF @VW!r
+ '+1'iLh.{+B'o,|4k
if (charindex(',', @OrderBy)=0 and charindex(@PK, @OrderBy)>0)
begin
--****************************************************************************sFa|;KzTL
--****************不需要创建主键********************************************
--****************************************************************************!\?%Ela)j aOZ
declare @SortDirection varchar(10) --排序方向,>=:升序,<=:倒序
set @SortDirection = '>='
if charindex('desc', @OrderBy) > 0
set @SortDirection = '<='
set @SQL2 = @SQL2 + ' declare @Sort varchar(100)'
--声明一个变量,用来记录当前页第一条记录的排序字段值