SQL分页存储过程源码(百万数据查询毫秒不到)

/* 
  @tbname         nvarchar(255),      --要分页显示的表名   注意:此处可以是表名,视图片,函数名
  @FieldKey       nvarchar(255),      --用于定位记录的主键(惟一键)字段,只能是单个字段  
  @PageCurrent    int=1,              --要显示的页码  
  @PageSize       int=10,             --每页的大小(记录数)  
  @FieldShow      nvarchar(1000),     --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段  
  @FieldOrder     nvarchar(1000),     --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC  
                                      --用于指定排序顺序  
  @Where          nvarchar(1000),     --查询条件  
  @PageCount      int   OUTPUT        --总页数 
 
 
 tbname这个参数是视图名称,也就是你必须要先建立一个视图,视图里获取的数据集就是你真正要查询的数据集了
 这个视图你可以进行多条连接,随便你怎么写,只要是select就好。

 那么为什么我们要用存储过程来调用这个视图呢,主要是为了传参数给它。

 FieldKey这个是主键,是必须的,也是唯一的索引,这样我们才能获取到正确的分页数据,否则就是乱的。

 PageCurrent 这个参数就是你需要获取的,当前页的页码了,比如,你需要第五页,那我们就传5

 PageSize 这个参数是每页显示的条数,随你喜欢。推荐10-25条,根据你的UI显示需要。

 FieldShow 这个是你要显示的字段,这些视段是从视图中提取的,所以名称要与视图的字段相同。如果不填写默认提取的是所有的字段。如果是多个字段,那么就用逗号分隔开,如id,userName,Address

 FieldOrder 这个是用来排序的,方法和SQL排序方法是一样的,但是我们传的参数不带order by,排序的对象是视图出来的数据集
 如:id desc,username Asc

 where参数是个比较关键的参数,该参数自带where所以我们只需要传条件,如 id=1 and userName='A.Z猫'

 PageCount 是一个output参数,即是这调用这个存储过程后,除了返回给你你所要查询的页码的数据集以外,还会返回你一个PageCount的output参数,这个参数的值是一共分了多少页,也就是总页数。

 
*/ 
--SET ANSI_NULLS ON
--SET QUOTED_IDENTIFIER ON
--GO
--
--DECLARE @tbname NVARCHAR(255) ,
--    @FieldKey NVARCHAR(255) ,
--    @PageCurrent INT,
--    @PageSize INT ,
--    @FieldShow NVARCHAR(1000) ,
--    @FieldOrder NVARCHAR(1000) ,
--    @Where NVARCHAR(1000) ,
--    @PageCount INT
--    
--SELECT @tbname='PRD_JO_WIP_HD',@FieldKey='STOCK_ID',@PageCurrent=2,@PageSize=10
--SELECT @Where='',@FieldShow='*',@FieldOrder='JOB_ORDER_NO'
--SELECT @PageCount=NULL

ALTER PROC [dbo].[CP_SELECT_SPLIT_PAGE_X]
 @tbname NVARCHAR(255) ,
  @FieldKey NVARCHAR(255) ,
  @PageCurrent INT = 1 ,
  @PageSize INT = 10 ,
  @FieldShow NVARCHAR(1000) ,
  @FieldOrder NVARCHAR(1000) ,
  @Where NVARCHAR(1000) ,
  @PageCount INT OUTPUT
AS

  DECLARE @sql NVARCHAR(4000)
 
  SET NOCOUNT ON
 
 --检查对象是否有效
  IF OBJECT_ID(@tbname) IS NULL
    BEGIN
      RAISERROR(N'对象"%s"不存在',1,16,@tbname)
      RETURN
    END

  IF OBJECTPROPERTY(OBJECT_ID(@tbname) , N'IsTable') = 0 AND OBJECTPROPERTY(OBJECT_ID(@tbname) , N'IsView') = 0 AND OBJECTPROPERTY(OBJECT_ID(@tbname) , N'IsTableFunction') = 0
    BEGIN
      RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
      RETURN
    END

 --分页字段检查
  IF ISNULL(@FieldKey , N'') = ''
    BEGIN
      RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
      RETURN
    END

 --其他参数检查及规范
  IF ISNULL(@PageCurrent , 0) < 1
    SET @PageCurrent = 1
  IF ISNULL(@PageSize , 0) < 1
    SET @PageSize = 10
  IF ISNULL(@FieldShow , N'') = N''
    SET @FieldShow = N'*'
  IF ISNULL(@FieldOrder , N'') = N''
    SET @FieldOrder = N''
  ELSE
    SET @FieldOrder = N'ORDER BY ' + LTRIM(@FieldOrder)
  IF ISNULL(@Where , N'') = N''
    SET @Where = N''
  ELSE
    SET @Where = N'WHERE (' + @Where + N')'

 --如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,
 --以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
  IF @PageCount IS NULL
    BEGIN
      SET @sql = N'SELECT @PageCount=COUNT(*)' + N' FROM ' + @tbname + N' ' + @Where
      EXEC sp_executesql @sql , N'@PageCount INT OUTPUT' , @PageCount OUTPUT
      SET @PageCount = (@PageCount + @PageSize - 1) / @PageSize
    END

 --计算分页显示的TOPN值
  DECLARE @TopN VARCHAR(20) , @TopN1 VARCHAR(20)
  SELECT @TopN = @PageSize , @TopN1 = @PageCurrent * @PageSize

 --第一页直接显示
  IF @PageCurrent = 1
    EXEC(N'SELECT TOP '+@TopN
    +N' '+@FieldShow
    +N' FROM '+@tbname
    +N' '+@Where
    +N' '+@FieldOrder)
  ELSE
    BEGIN
      SELECT @PageCurrent = @TopN1 , @sql = N'SELECT @n=@n-1,@s=CASE WHEN @n<' + @TopN + N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST(' + @FieldKey + N' as varchar(8000))),N'''''''') ELSE N'''' END FROM ' + @tbname + N' ' + @Where + N' ' + @FieldOrder
      SET ROWCOUNT @PageCurrent
      EXEC sp_executesql @sql , N'@n INT,@s nvarchar(4000) OUTPUT' , @PageCurrent , @sql OUTPUT
      SET ROWCOUNT 0
   
      IF @sql = N''
        EXEC(N'SELECT TOP 0' +N' '+@FieldShow +N' FROM '+@tbname)
      ELSE
        BEGIN
          SET @sql = STUFF(@sql , 1 , 1 , N'')
        
     --执行查询
          EXEC(N'SELECT TOP '+@TopN
          +N' '+@FieldShow
          +N' FROM '+@tbname
          +N' WHERE '+@FieldKey
          +N' IN('+@sql
          +N') '+@FieldOrder)
        END
    END

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值