简单易用的分页存储过程(只按唯一性字段排序)

USE [test]
GO
/****** 对象:  StoredProcedure [dbo].[PublicSplitPage_sp]    脚本日期: 06/29/2012 16:00:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE  PROCEDURE [dbo].[PublicSplitPage_sp]
@TableName varchar(8000),            --表名
@SqlStr    varchar(8000)=null,    --查询语句
@Condition varchar(8000),    --查询条件
@PageIndex int,                --页所引,从0开始
@PageSize int,                --分页大小
@orderDESC varchar(100),    --倒排序字段,支持多个字段
@orderASC varchar(100),        --顺排序字段,支持多个,字段先后顺序与倒排序一致
@PKField  varchar(50)='*',    --索引字段
@SearField varchar(1000),    --查询字段
@RecordCount int out        --返回记录数
AS
if @SqlStr is not null and @SqlStr<>''
begin
    exec(@SqlStr)
    select @RecordCount=@@ROWCOUNT
end 
else
begin
    declare @iTop int,@tmpTop int
    declare @vSQL nvarchar(2000)
    set @vSQL = N'select @count=Count('+@PKField+') from ' + @TableName + ' where ' + @Condition
    exec sp_ExecuteSQL @vSQL, N'@count int output', @RecordCount output    
    set @iTop=@PageSize
    set @tmpTop=@RecordCount-(@PageSize*(@PageIndex-1))
    if @RecordCount<@PageSize*@PageIndex
    begin
        set @iTop=@tmpTop
    end
    
    DECLARE @sqlStr1 varchar(8000)
    IF @PageIndex = 1
        SET @sqlStr1 = 'SELECT TOP ' + STR(@PageSize) + '  '+@SearField+'  FROM '+@TableName+' WHERE '+@Condition+' ORDER BY  '+@orderDESC
    ELSE if @PageIndex<@RecordCount/(2*@PageSize)    -- 此处可以加优化,从中间页往两边
        SET @sqlStr1 = 'SELECT TOP ' + STR(@PageSize) + '  * FROM (select top  ' + STR(@PageSize) + '  * from (SELECT TOP ' 
             + STR(@PageSize*@PageIndex) + '  '+@SearField+'  FROM '+@TableName
             +' WHERE '+@Condition+'  ORDER BY '+@orderDESC+') TempTable order by '+@orderASC+') A  ORDER BY  '+@orderDESC
    else
        SET @sqlStr1 = 'SELECT TOP ' + STR(@iTop) + '  * FROM (SELECT TOP ' 
             + STR(@tmpTop) + '  '+@SearField+'  FROM '+@TableName
             +' WHERE '+@Condition+'  ORDER BY '+@orderASC+') TempTable  ORDER BY  '+@orderDESC
    print(@sqlStr1)
    EXEC(@sqlStr1)
end

转载于:https://www.cnblogs.com/pengbp/archive/2012/06/29/2570139.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值