码迷,mamicode.com
首页 > 其他好文 > 详细

存储过程分页(1)

时间:2015-08-02 15:13:12      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:

create PROCEDURE Sp_Conn_Sort
(
@tblName   varchar(255),       -- 表名

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

@fldName varchar(255)=‘‘,      -- 排序的字段名

@PageSize   int = 40,          -- 页尺寸

@PageIndex  int = 1,           -- 页码

@doCount  bit = 0,   -- 返回记录总数, 非 0 值则返回

@OrderType bit = 0,  -- 设置排序类型, 非 0 值则降序
@strWhere  varchar(1500)=‘‘  -- 查询条件 (注意: 不要加 where)
)
AS

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

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

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

 

if @doCount != 0

  begin

    if @strWhere !=‘‘

    set @strSQL = select count(*) as Total from  + @tblName +  where +@strWhere

    else

    set @strSQL = select count(*) as Total from  + @tblName

end 

--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况

else

begin

 

if @OrderType != 0

begin

    set @strTmp = <(select min

set @strOrder =  order by  + @fldName + desc

--如果@OrderType不是0,就执行降序,这句很重要!

end

else

begin

    set @strTmp = >(select max

    set @strOrder =  order by  + @fldName + asc

end

 

if @PageIndex = 1

begin

    if @strWhere != ‘‘  

    set @strSQL = select top  + str(@PageSize) + +@strGetFields+   from  + @tblName +  where  + @strWhere +   + @strOrder

     else

     set @strSQL = select top  + str(@PageSize) + +@strGetFields+   from + @tblName +  + @strOrder

--如果是第一页就执行以上代码,这样会加快执行速度

end

else

begin

--以下代码赋予了@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 + ‘‘ + @strOrder + ) as tblTmp)+ @strOrder

 

if @strWhere != ‘‘

    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

end

end  

exec (@strSQL)

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

sql server 2000 单主键高效分页存储过程 (支持多字段排序)

Create PROC P_viewPage         
    /*          
    nzperfect [no_mIss] 高效通用分页存储过程(双向检索) 2007.5.7  QQ:34813284          
    敬告:适用于单一主键或存在唯一值列的表或视图          
    ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围          
    */          
    @TableName VARCHAR(200),     --表名          
    @FieldList VARCHAR(2000),    --显示列名,如果是全部字段则为*          
    @PrimaryKey VARCHAR(100),    --单一主键或唯一值键          
    @Where VARCHAR(2000),        --查询条件 不含‘where‘字符,如id>10 and len(userid)>9          
    @Order VARCHAR(1000),        --排序 不含‘order by‘字符,如id asc,userid desc,必须指定asc或desc          
    --注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷          
    @SortType INT,               --排序规则 1:正序asc 2:倒序desc 3:多列排序方法          
    @RecorderCount INT,          --记录总数 0:会返回总记录          
    @PageSize INT,               --每页输出的记录数          
    @PageIndex INT,              --当前页数          
    @TotalCount INT OUTPUT ,      --记返回总记录          
    @TotalPageCount INT OUTPUT   --返回总页数          
AS          
SET NOCOUNT ON          
    IF ISNULL(@TotalCount,‘‘) = ‘‘ SET @TotalCount = 0          
    SET @Order = RTRIM(LTRIM(@Order))          
    SET @PrimaryKey = RTRIM(LTRIM(@PrimaryKey))          
    SET @FieldList = REPLACE(RTRIM(LTRIM(@FieldList)), ,‘‘)          
    WHILE CHARINDEX(, ,@Order) > 0 or CHARINDEX( ,,@Order) > 0          
        BEGIN          
            SET @Order = REPLACE(@Order,, ,,)          
            SET @Order = REPLACE(@Order, ,,,)          
        END          
    IF ISNULL(@TableName,‘‘) = ‘‘ or ISNULL(@FieldList,‘‘) = ‘‘          
            or ISNULL(@PrimaryKey,‘‘) = ‘‘          
            or @SortType < 1 or @SortType >3          
            or @RecorderCount  < 0 or @PageSize < 0 or @PageIndex < 0          
        BEGIN          
            PRINT(ERR_00)          
            RETURN          
        END          
    IF @SortType = 3          
        BEGIN          
            IF (UPPER(RIGHT(@Order,4))!= ASC AND UPPER(RIGHT(@Order,5))!= DESC)          
                BEGIN PRINT(ERR_02) RETURN END          
        END          
    DECLARE @new_where1 VARCHAR(1000)          
    DECLARE @new_where2 VARCHAR(1000)          
    DECLARE @new_order1 VARCHAR(1000)          
    DECLARE @new_order2 VARCHAR(1000)          
    DECLARE @new_order3 VARCHAR(1000)          
    DECLARE @Sql VARCHAR(8000)          
    DECLARE @SqlCount NVARCHAR(4000)          
    IF ISNULL(@where,‘‘) = ‘‘          
        BEGIN          
            SET @new_where1 =            
            SET @new_where2 =  Where            
        END          
    ELSE          
        BEGIN          
            SET @new_where1 =  Where  + @where          
            SET @new_where2 =  Where  + @where +  AND           
        END          
    IF ISNULL(@order,‘‘) = ‘‘ or @SortType = 1  or @SortType = 2          
        BEGIN          
            IF @SortType = 1          
                BEGIN          
                    SET @new_order1 =  orDER BY  + @PrimaryKey +  ASC          
                    SET @new_order2 =  orDER BY  + @PrimaryKey +  DESC          
                END          
            IF @SortType = 2          
                BEGIN          
                    SET @new_order1 =  orDER BY  + @PrimaryKey +  DESC          
                    SET @new_order2 =  orDER BY  + @PrimaryKey +  ASC          
                END          
        END          
    ELSE          
        BEGIN          
            SET @new_order1 =  orDER BY  + @Order          
        END          
    
    IF @SortType = 3 AND  CHARINDEX(,+@PrimaryKey+ ,,+@Order)>0          
    BEGIN          
        SET @new_order1 =  orDER BY  + @Order          
        SET @new_order2 = @Order + ,          
        SET @new_order2 = REPLACE(REPLACE(@new_order2,ASC,,{ASC},),DESC,,{DESC},)          
        SET @new_order2 = REPLACE(REPLACE(@new_order2,{ASC},,DESC,),{DESC},,ASC,)          
        SET @new_order2 =  orDER BY  + SUBSTRING(@new_order2,1,LEN(@new_order2)-1)          
        IF @FieldList <> *          
            BEGIN          
                SET @new_order3 = REPLACE(REPLACE(@Order + ,,ASC,,,),DESC,,,)          
                SET @FieldList = , + @FieldList          
                WHILE CHARINDEX(,,@new_order3)>0          
                    BEGIN          
                        IF CHARINDEX(SUBSTRING(,+@new_order3,1,CHARINDEX(,,@new_order3)),,+@FieldList+,)>0          
                            BEGIN          
                                SET @FieldList =          
                                @FieldList + , + SUBSTRING(@new_order3,1,CHARINDEX(,,@new_order3))          
                            END          
                        SET @new_order3 =          
                        SUBSTRING(@new_order3,CHARINDEX(,,@new_order3)+1,LEN(@new_order3))          
                    END          
                SET @FieldList = SUBSTRING(@FieldList,2,LEN(@FieldList))          
            END          
        END     
         
    SET @SqlCount = Select @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/          
    + CAST(@PageSize AS VARCHAR)+) FROM (Select * FROM  + @TableName + @new_where1+) AS T          
    IF @RecorderCount  = 0          
        BEGIN          
            EXEC SP_EXECUTESQL @SqlCount,N@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT,          
            @TotalCount OUTPUT,@TotalPageCount OUTPUT          
        END          
    ELSE          
        BEGIN          
            Select @TotalCount = @RecorderCount        
        END          
    IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)          
        BEGIN          
            SET @PageIndex =  CEILING((@TotalCount+0.0)/@PageSize)          
        END          
    IF @PageIndex = 1 or @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)          
        BEGIN          
            IF @PageIndex = 1 --返回第一页数据          
                BEGIN          
                    SET @Sql = Select * FROM (Select TOP  + STR(@PageSize) +   + @FieldList +  FROM           
                    + @TableName + @new_where1 + @new_order1 +) AS TMP  + @new_order1    
                END          
            IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)  --返回最后一页数据          
                BEGIN          
                    SET @Sql = Select TOP  + STR(@PageSize) +   + @FieldList +  FROM (          
                    + Select TOP  + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize))          
                    +   + @FieldList +  FROM           
                    + @TableName + @new_where1 + @new_order2 +  ) AS TMP           
                    + @new_order1          
                END          
        END          
    ELSE      
            
        BEGIN          
        IF @SortType = 1  --仅主键正序排序          
            BEGIN          
                IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索          
                    BEGIN          
                        SET @Sql = Select TOP  + STR(@PageSize) +   + @FieldList +  FROM           
                        + @TableName + @new_where2 + @PrimaryKey +  >           
                        + (Select MAX( + @PrimaryKey + ) FROM (Select TOP           
                        + STR(@PageSize*(@PageIndex-1)) +   + @PrimaryKey          
                        +  FROM  + @TableName          
                        + @new_where1 + @new_order1 + ) AS TMP) + @new_order1          
                    END          
                ELSE  --反向检索          
                    BEGIN          
                        SET @Sql = Select TOP  + STR(@PageSize) +   + @FieldList +  FROM (          
                        + Select TOP  + STR(@PageSize) +            
                        + @FieldList +  FROM           
                        + @TableName + @new_where2 + @PrimaryKey +  <           
                        + (Select MIN( + @PrimaryKey + ) FROM (Select TOP          
                        + STR(@TotalCount-@PageSize*@PageIndex) +   + @PrimaryKey          
                        +  FROM  + @TableName          
                        + @new_where1 + @new_order2 + ) AS TMP) + @new_order2          
                        +  ) AS TMP  + @new_order1          
                    END          
            END          
        IF @SortType = 2  --仅主键反序排序          
            BEGIN          
                IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索          
                    BEGIN          
                        SET @Sql = Select TOP  + STR(@PageSize) +   + @FieldList +  FROM           
                        + @TableName + @new_where2 + @PrimaryKey +  <           
                        + (Select MIN( + @PrimaryKey + ) FROM (Select TOP           
                        + STR(@PageSize*(@PageIndex-1)) +   + @PrimaryKey          
                        + FROM + @TableName          
                        + @new_where1 + @new_order1 + ) AS TMP) + @new_order1          
                    END          
                ELSE  --反向检索          
                    BEGIN          
                        SET @Sql = Select TOP  + STR(@PageSize) +   + @FieldList +  FROM (          
                        + Select TOP  + STR(@PageSize) +            
                        + @FieldList +  FROM           
                        + @TableName + @new_where2 + @PrimaryKey +  >           
                        + (Select MAX( + @PrimaryKey + ) FROM (Select TOP           
                        + STR(@TotalCount-@PageSize*@PageIndex) +   + @PrimaryKey          
                        +  FROM  + @TableName          
                        + @new_where1 + @new_order2 + ) AS TMP) + @new_order2          
                        +  ) AS TMP  + @new_order1          
                    END          
            END          
        IF @SortType = 3  --多列排序,必须包含主键,且放置最后,否则不处理          
            BEGIN          
                IF CHARINDEX(, + @PrimaryKey +  ,, + @Order) = 0          
                    BEGIN PRINT(ERR_02) RETURN END          
                    IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索          
                        BEGIN          
                            SET @Sql = Select TOP  + STR(@PageSize) +   + @FieldList +  FROM (           
                            + Select TOP  + STR(@PageSize) +   + @FieldList +  FROM (           
                            +  Select TOP  + STR(@PageSize*@PageIndex) +   + @FieldList          
                            +  FROM  + @TableName + @new_where1 + @new_order1 +  ) AS TMP           
                            + @new_order2 +  ) AS TMP  + @new_order1          
                        END          
                    ELSE  --反向检索          
                        BEGIN          
                            SET @Sql = Select TOP  + STR(@PageSize) +   + @FieldList +  FROM (           
                            + Select TOP  + STR(@PageSize) +   + @FieldList +  FROM (           
                            +  Select TOP  + STR(@TotalCount-@PageSize *@PageIndex+@PageSize) +   + @FieldList          
                            +  FROM  + @TableName + @new_where1 + @new_order2 +  ) AS TMP           
                            + @new_order1 +  ) AS TMP  + @new_order1          
                        END          
            END          
        END          
    PRINT(@SQL)          
    EXEC(@Sql)

 

存储过程分页(1)

标签:

原文地址:http://www.cnblogs.com/roboot/p/4695758.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!