学习----实践---学习

学习为了实践而准备,实践总结了我们的不足
只有在学习学习中实践,实践中不断总结、不断学习,这样我们才不会落伍。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

sql 分页存储过程实例(二)

Posted on 2007-08-15 17:53  学习----实践---学习  阅读(324)  评论(0编辑  收藏  举报
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'PageShowOne' AND type = 'P')
   DROP PROCEDURE PageShowOne
GO

CREATE Proc PageShowOne
    @PageSize int=10 ,--
每页显示的记录数
    @PageCurrent int=1 ,--
当前要显示的页号
    @FdName varchar(100)='' ,--
主键名或者标识列名
    @SelectStr varchar(2000)='', --select
子句,不包含select关键字,如:*或者Id,UserId,UserName等。
    @FromStr varchar(1000)='', --from
子句,不包含from关键子,如:myTable或者myTable,yourTable
    @WhereStr varchar(2000)='', --Where
子句,不包含where关键字,如空的,或者 id>2
    @OrderByStr varchar(1000)='',--order by
子句,不包含order by 子句 ,如id desc,UserId asc
    @CountRows int=0 output, --
返回记录总数
    @CountPage int=0 output --
返回总页数
as
--------
定义局部变量---------
declare @Id1 varchar(20),@Id2 varchar(20) --
开始和结束的记录号
declare @OrderBySqls varchar(1000) --order by
子句
declare @WhereSqls varchar(2000) --where
子句
declare @Sqls nvarchar(4000) --
最终组合成的Sqls语句
declare @TmpStr varchar(2000) --
临时
----------------------------
if @OrderByStr <> ''
    set @OrderBySqls = ' order by '+@OrderByStr
else
    set @OrderBySqls = ''
--------
if @WhereStr <> ''
    set @WhereSqls = ' where ('+@WhereStr+')'
else
    set @WhereSqls = ''
--------
set @TmpStr = @WhereSqls
--
如果显示第一页,可以直接用top来完成
if @PageCurrent<=1
begin
    select @Id1=cast(@PageSize as varchar(20))
    exec('select top '+@Id1+' '+@SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls)
    goto LabelRes
end
---------------------------
select @Id1=cast(@PageSize as varchar(20))
       ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))
----------
if @WhereSqls <> ''
    set @WhereSqls = @WhereSqls + ' and (' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+'))'
else
    set @WhereSqls = ' where ' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+')'
----------
set @Sqls = 'select top '+@Id1+ ' '+ @SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls
exec (@Sqls)
-----------
LabelRes:
-----
返回总记录数
set @Sqls = 'select @a=count(1)  from '+@FromStr+@TmpStr
exec sp_executesql @sqls,N'@a int output',@CountRows output
-----
返回总页数
if @CountRows <= @PageSize
    set @CountPage = 1
else
begin
    set @CountPage = @CountRows/@PageSize
    if (@CountRows%@PageSize) > 0
       set @CountPage = @CountPage + 1
end
return
GO
//----
分页存储过程结束