分页存储过程,无错版,本人亲测

来源:互联网 发布:汕头2000年迎宾馆知乎 编辑:程序博客网 时间:2024/04/29 00:35
--drop procedure p_page
--go

create procedure p_page

(
@Tables   varchar(1000), --表名如testtable
@PrimaryKey   varchar(100),--表的主键,必须唯一性
@Sort   varchar(200)   =   NULL,--排序字段如f_Name asc或f_name desc(注意只能有一个排序字段)
@CurrentPage   int   =   1,--当前页
@PageSize   int   =   10,---每页大小
@Fields   varchar(1000)   =   '*',--显示的字段列表
@Filter   varchar(1000)   =   NULL,--条件语句,不加where,如 f_id>3
@Group   varchar(1000)   =   NULL,--分组字段
@TotalPage int    output --返回总页数
)

WITH ENCRYPTION ---加密存储

AS



    SET NOCOUNT ON
    Declare @intResult Int    

    Begin Tran

    DECLARE @sql nvarchar(4000)
    
    if @Filter is null or @Filter=''  
        set @Sql = 'select @intResult = count(' + @PrimaryKey + ') from ' +  @Tables
        else
        set @Sql = 'select @intResult = count(' + @PrimaryKey + ') from ' +  @Tables + ' where + ' + @Filter    
 
    EXEC sp_executesql @sql,N'@intResult int OUTPUT',@intResult OUTPUT--计算总记录数
    select @TotalPage=CEILING((@intResult+0.0)/@PageSize)--计算总页数
    
    
    IF   @Sort   IS   NULL   or   @Sort   =   ''
    SET   @Sort   =   @PrimaryKey

    DECLARE   @SortTable   varchar(100)
    DECLARE   @SortName   varchar(100)
    DECLARE   @strSortColumn   varchar(200)
    DECLARE   @operator   char(2)
    DECLARE   @type   varchar(100)
    DECLARE   @prec   int
    
    IF   CHARINDEX('DESC',@Sort)>0
      BEGIN
        SET   @strSortColumn   =   REPLACE(@Sort,   'DESC',   '')
        SET   @operator   =   '<='
      END
    ELSE
         IF   CHARINDEX('ASC',   @Sort)   >   0
           BEGIN  
              SET   @strSortColumn   =   REPLACE(@Sort,   'ASC',   '')
              SET   @operator   =   '>='
           END
        
        ELSE    
           BEGIN
            SET   @strSortColumn  = @SORT
            SET   @operator   =   '>='
           END
    
    IF   CHARINDEX('.',   @strSortColumn)   >   0
        BEGIN
          SET   @SortTable   =   SUBSTRING(@strSortColumn,   0,   CHARINDEX('.',@strSortColumn))
          SET   @SortName   =   SUBSTRING(@strSortColumn,   CHARINDEX('.',@strSortColumn)   +   1,   LEN(@strSortColumn))
        END
    ELSE
        BEGIN
          SET   @SortTable   =   @Tables
          SET   @SortName   =   @strSortColumn
        END
    
    Select   @type=t.name,   @prec=c.prec
    FROM   sysobjects   o   
    JOIN   syscolumns   c   on   o.id=c.id
    JOIN   systypes   t   on   c.xusertype=t.xusertype
    Where   o.name   =   @SortTable   AND   c.name   =   @SortName
    
    IF   CHARINDEX('char',   @type)   >   0
          SET   @type   =   @type   +   '('   +   CAST(@prec   AS   varchar)   +   ')'
    
    DECLARE   @strPageSize   varchar(50)
    DECLARE   @strStartRow   varchar(50)
    DECLARE   @strFilter   varchar(1000)
    DECLARE   @strSimpleFilter   varchar(1000)
    DECLARE   @strGroup   varchar(1000)
    
    IF   @CurrentPage   <   1
    SET   @CurrentPage   =   1
    
    SET   @strPageSize   =   CAST(@PageSize   AS   varchar(50))
    SET   @strStartRow   =   CAST(((@CurrentPage   -   1)*@PageSize   +   1)   AS   varchar(50))
    
    IF   @Filter   IS   NOT   NULL   AND   @Filter   !=   ''
      BEGIN
        SET   @strFilter   =   '   Where   '   +   @Filter   +   '   '
        SET   @strSimpleFilter   =   '   AND   '   +   @Filter   +   '   '
      END
    ELSE
      BEGIN
        SET   @strSimpleFilter   =   ''
        SET   @strFilter   =   ''
      END
    
    IF   @Group   IS   NOT   NULL   AND   @Group   !=   ''
      SET   @strGroup   =   '   GROUP   BY   '   +   @Group   +   '   '
    ELSE
      SET   @strGroup   =   ''
    
    set @sql = 'DECLARE   @SortColumn   '   +   @type   +   '
    SET   ROWCOUNT   '   +   @strStartRow   +   '
    Select   @SortColumn='   +   @strSortColumn   +   '   FROM   '   +   @Tables   +   @strFilter   +   '   '   +   @strGroup   +   '   orDER   BY   '   +   @Sort   +   '
    SET   ROWCOUNT   '   +   @strPageSize   +   '
    Select   '   +   @Fields   +   '   FROM   '   +   @Tables   +   '   Where   '   +   @strSortColumn   +   @operator   +   '   @SortColumn   '   +   @strSimpleFilter   +   '   '   +   @strGroup   +   '   orDER   BY   '   +   @Sort   +   '
    '
    
    exec(@sql)
    --print @sql

-------------------------------------------------------------------------------------------------

    If @@Error <> 0
       Begin
           RollBack Tran
           Return -1
       End
    Else
       Begin
           Commit Tran
           Return @intResult ---返回记录总数
       End

GO

------
试用:
declare @TotalPage int,@RecordCount int
set @TotalPage=1
execute @RecordCount=dbo.p_page 'jxcliushui','id','日期 desc',500,15,'*','日期>=''2007-10-01''','',@TotalPage output
print @TotalPage
print @RecordCount
-----
返回结果:    1308
                    19611
原创粉丝点击