一种分页存储过程

Posted on 2006-04-05 10:24  悔晟  阅读(248)  评论(0编辑  收藏  举报

Community_Common_Count_USP
/**//*
作者: SLIGHTBOY
建立日期: 2005-8-17
修改日期:
存储作用: 通用记录统计
作用数据库: 自定义
输入变量:
    @KeyColumn 主键字段名
    @TableName 表格名称
    @SearchQuery 查询条件 默认 ''
  输出变量:
  中间变量:
*/
CREATE PROCEDURE dbo.Community_Common_Count_USP
(
  @KeyColumn varchar(20),
  @TableName varchar(20),
  @SearchQuery varchar(400) = ''
)
AS
  SET NOCOUNT ON
  DECLARE @Timer datetime
  SET @Timer = getdate()
 
  IF ( @SearchQuery IS Not NULL ) AND ( @SearchQuery <> '' )
   exec('SELECT Count('+ @KeyColumn +') FROM ['+ @TableName +'] Where '+ @SearchQuery)
  Else
   exec('SELECT Count('+ @KeyColumn +') FROM ['+ @TableName +']')
 
  print(DATEDIFF(millisecond, @Timer, getdate()))
 GO
 
 
 Community_Common_Page_USP
 /**//*
   作者:  SLIGHTBOY
   建立日期: 2005-8-12
   修改日期:
   存储作用: 通用分页存储过程
   作用数据库: 自定义
   版本:  1.0
   输入变量:
       @AbsolutePage 请求页 默认 1
       @PageSize  每页记录数 默认 20
       @RecordCount 总记录
       @KeyColumn 主键字段名
       @SelectColumn 查询字段
       @TableName 表格名称
       @Sort  排序方式 DESC
       @SearchQuery 查询条件 默认 ''
       @ExpandQuery 扩展内容(FOR XML EXPLICIT) 默认 ''
   输出变量:
   过程变量
       @SqlQuery 查询语句
       @AbsolutePosition 当前位置
 */
 CREATE PROCEDURE dbo.Community_Common_Page_USP
 (
   @AbsolutePage int = 1,
   @PageSize int = 20,
   @RecordCount int,
   @KeyColumn varchar(20),
   @SelectColumn varchar(1000),
   @TableName varchar(20),
   @Sort varchar(4) = '',
   @SearchQuery varchar(400) = '',
   @ExpandQuery varchar(50) = ''
 )
 AS
   SET NOCOUNT ON
  DECLARE @Timer datetime
  SET @Timer = getdate()
 
  DECLARE @SqlQuery varchar(3000)
  DECLARE @AbsolutePosition int
  SET @AbsolutePosition = @AbsolutePage * @PageSize
 
  IF ( @AbsolutePosition = @PageSize )
   IF ( @Sort = 1 )
    SET @SqlQuery = '
    SELECT TOP '+ LTRIM( STR( @PageSize ) ) +'
    '+ @SelectColumn +'
    FROM ['+ @TableName +']
    '+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
    ORDER BY '+ @KeyColumn +' ASC
    '+ @ExpandQuery
   Else
   
    SET @SqlQuery = '
    SELECT TOP '+ LTRIM( STR( @PageSize ) ) +'
    '+ @SelectColumn +'
    FROM ['+ @TableName +']
    '+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
    ORDER BY '+ @KeyColumn +' DESC
    '+ @ExpandQuery
  -- 大于 首页 小于 中间页
  Else IF ( @AbsolutePosition <= @RecordCount/2  )
   IF ( @Sort = 1 )
   SET @SqlQuery = '
   SELECT TOP '+ LTRIM( STR( @PageSize ) ) +' '+ @SelectColumn +'
   FROM ['+ @TableName +']
   WHERE '+ @KeyColumn +' >
   (
    SELECT MAX('+ @KeyColumn +')
    FROM
    (
     SELECT TOP '+ LTRIM( STR( ( @AbsolutePage - 1)*@PageSize) ) +'
     '+ @KeyColumn +'
     FROM ['+ @TableName +']
     '+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
     ORDER BY '+ @KeyColumn +' ASC
    ) As Child
   )
   '+ dbo.iif(@SearchQuery, ' AND '+ @SearchQuery, '' ) +'
   ORDER BY '+ @KeyColumn +' ASC
   '+ @ExpandQuery
  Else
   SET @SqlQuery = '
   SELECT TOP '+ LTRIM( STR( @PageSize ) ) +' '+ @SelectColumn +'
   FROM ['+ @TableName +']
   WHERE '+ @KeyColumn +' <=
   (
    SELECT Min('+ @KeyColumn +')
    FROM
    (
     SELECT TOP '+ LTRIM( STR( ( @AbsolutePage - 1)*@PageSize + 1 ) ) +'
     '+ @KeyColumn +'
     FROM ['+ @TableName +']
     '+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
     ORDER BY '+ @KeyColumn +' DESC
    ) As Child
   )
   '+ dbo.iif(@SearchQuery, ' AND '+ @SearchQuery, '' ) +'
   ORDER BY '+ @KeyColumn +' DESC
   '+ @ExpandQuery
 Else IF (@AbsolutePosition > @RecordCount/2 )
  IF ( @Sort = 1 )
   SET @SqlQuery = '
   SELECT TOP '+ LTRIM( STR( @PageSize ) ) +' '+ @SelectColumn +'
   FROM ['+ @TableName +']
   WHERE '+ @KeyColumn +' >
   (
    SELECT Min('+ @KeyColumn +')
    FROM
    (
     SELECT TOP '+ LTRIM( STR( @RecordCount - ((@AbsolutePage - 1) * @PageSize ) + 1) ) +'
     '+ @KeyColumn +'
     FROM ['+ @TableName +']
     '+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
     ORDER BY '+ @KeyColumn +' DESC
    ) As Child
   )
   '+ dbo.iif(@SearchQuery, ' AND '+ @SearchQuery, '' ) +'
   ORDER BY '+ @KeyColumn +' ASC
   '+ @ExpandQuery
  Else
   SET @SqlQuery = '
   SELECT TOP '+ LTRIM( STR( @PageSize ) ) +' '+ @SelectColumn +'
   FROM ['+ @TableName +']
   WHERE '+ @KeyColumn +' <
   (
    SELECT MAX('+ @KeyColumn +')
    FROM
   (
     SELECT TOP '+ LTRIM( STR( @RecordCount - ((@AbsolutePage - 1) * @PageSize ) + 1) ) +'
     '+ @KeyColumn +'
     FROM ['+ @TableName +']
     '+ dbo.iif(@SearchQuery, 'Where '+ @SearchQuery, '' ) +'
     ORDER BY '+ @KeyColumn +' ASC
    ) As Child
   )
   '+ dbo.iif(@SearchQuery, ' AND '+ @SearchQuery, '' ) +'
   ORDER BY '+ @KeyColumn +' DESC
   '+ @ExpandQuery

exec(@SqlQuery)
print(@SqlQuery)
print(DATEDIFF(millisecond, @Timer, getdate()))

GO

Copyright © 2024 悔晟
Powered by .NET 8.0 on Kubernetes