系统通用分页过程

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

--***********************************************************************
--* 名        称:UTIL_GetOnePage
--* 功        能:系统通用分页过程
--* 作        者:

--* 日        期:2007-05-22
--* 说        明:排序字段只能是一列或空
--* 返   回   值:
--* 修    改:--***********************************************************************
ALTER PROCEDURE [dbo].[UTIL_GetOnePage]
 @TableName VARCHAR(255),   --表名(视图名)
 @ListFields VARCHAR(8000) = '*' , --需要返回的列,默认全部列
 @WhereCause VARCHAR(8000) = '',  --查询条件,不要加'where',默认无
 @OrderField VARCHAR(255) = '1',  --排序的字段名,不要加'order by',默认不排序
 @OrderType VARCHAR(4) = 'ASC',  --设置排序类型,默认升序
 @GetCount INT = 0,    --0返回全部记录, 非0值则返回页记录集,默认全部
 @PageSize INT = 10,    --页尺寸,默认10
 @PageIndex INT = 1     --页码,默认第一页
AS
BEGIN
 SET NOCOUNT ON

 DECLARE @strSQL   VARCHAR(8000) --动态sql语句
 DECLARE @S    NVARCHAR(2000) 
 DECLARE @COUNT   BIGINT
 DECLARE @TOP   BIGINT   --标志变量(0.中间页;>0.尾页;<0超出页码范围)

 --格式化传入的参数
 SET @TableName   = LTRIM(RTRIM(@TableName))
 SET @ListFields  = LTRIM(RTRIM(ISNULL(@ListFields,'*')))
 SET @WhereCause  = LTRIM(RTRIM(ISNULL(@WhereCause,'')))
 SET @OrderField  = LTRIM(RTRIM(ISNULL(@OrderField,'1')))
 SET @OrderType   = LTRIM(RTRIM(ISNULL(@OrderType,'ASC')))

 --不是最后的页
 SET @TOP = 0

 --限制分页的条目数<100000
 IF (@PageSize <= 0)  OR (@PageSize > 100000)
  SET @PageSize = 10
 
 --限制非法页码
 IF @PageIndex < = 0
  SET @PageIndex = 1

 --若果不指明排序字段,默认依据列表的第一列;可以再优化
 IF @OrderField = ''
  SET @OrderField = '1'

 --需要返回的列,默认全部列
 IF @ListFields = ''
  SET @ListFields = '*'

 --构建WHEER条件语句
 IF @WhereCause <> ''
  SET @WhereCause = ' WHERE ' + @WhereCause + ' '

 --构建ASC条件语句
 IF @OrderType NOT IN ('ASC','DESC')
  SET @OrderType = 'ASC'


 --如果仅要求查出总条数,则根据where语句查询后返回!
 IF @GetCount = 0
 BEGIN
  SET @strSQL = 'SELECT COUNT(*) FROM ' + @TableName + ' ' + @WhereCause
  EXEC (@strSQL)
  RETURN
 END
 --进行分页查询
 ELSE
 BEGIN
  --确定是否是最后一页且取出最后一页应该取出的条目数
  IF @PageIndex > 1
  BEGIN
   SET @S = N'SELECT COUNT(*) FROM ' + @TableName + ' ' + @WhereCause
   CREATE TABLE #T(C BIGINT)
   INSERT INTO #T(C) 
   EXEC(@S)
   SELECT @COUNT = C FROM #T
   DROP TABLE #T
   --EXEC SP_EXECUTESQL @S,N'@C BIGINT OUTPUT',@COUNT OUTPUT
   IF (@COUNT > @PageSize) AND (@PageIndex > 1)
   BEGIN
    IF(@COUNT > @PageSize * (@PageIndex - 1)) AND (@COUNT < @PageSize * @PageIndex)
     SET @TOP = @COUNT - @PageSize * (@PageIndex - 1)
    ELSE IF (@COUNT < @PageSize * (@PageIndex - 1))
     SET @TOP = -1 
   END
  END

  --如果是第一页
  IF @PageIndex = 1 
   SET @strSQL = 'SELECT TOP ' + CAST(@PageSize AS VARCHAR(20)) + ' ' + @ListFields + ' '
      + 'FROM ' + @TableName +  ' ' +  @WhereCause + ' '
      + 'ORDER BY ' + @OrderField + ' ' + @OrderType --源顺序
  --其他页
  ELSE
  BEGIN
   --超出页码范围
   IF @TOP < 0 
    SET @strSQL = 'SELECT ' + @ListFields + ' '
       + 'FROM ' + @TableName +  ' '
       + 'WHERE 0 > 1 '
   --最后一页
   ELSE IF @TOP > 0 
    SET @strSQL = 'SELECT * FROM ('
       +    'SELECT TOP ' + CAST(@TOP AS VARCHAR(20)) + ' ' + @ListFields + ' '
       +    'FROM ' + @TableName +  ' ' +  @WhereCause + ' '
       +    'ORDER BY ' + @OrderField + ' ' + (CASE @OrderType WHEN 'ASC' THEN 'DESC' ELSE 'ASC' END) --倒序
       +    ') T '
       + 'ORDER BY ' + @OrderField + ' ' + @OrderType --源顺序
   --中间的页
   ELSE
    SET @strSQL = 'SELECT * '
       + 'FROM ('
       +   'SELECT TOP ' + CAST(@PageSize AS VARCHAR(20)) + ' * '
       +   'FROM ' 
       +    '('
       +    'SELECT TOP ' + CAST(@PageSize * @PageIndex AS VARCHAR(20)) + ' ' + @ListFields + ' '
       +    'FROM ' + @TableName +  ' ' +  @WhereCause + ' '
       +    'ORDER BY ' + @OrderField + ' ' + @OrderType --源顺序
       +    ') T '
       +        'ORDER BY ' + @OrderField + ' ' + (CASE @OrderType WHEN 'ASC' THEN 'DESC' ELSE 'ASC' END) --倒序
       +  ') M '
       + 'ORDER BY ' + @OrderField + ' ' + @OrderType --源顺序 
  END
 END

 --执行构建语句,返回结果集
 --SELECT @strSQL
 EXEC (@strSQL)

 SET NOCOUNT ON
END

 

 

 

 

 

 

 

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

--***********************************************************************
--* 名        称:UTIL_GetOnePage2
--* 功        能:系统通用分页过程(依据唯一索引列排序)
--* 作        者:

--* 日        期:2007-05-22
--* 说        明:排序字段只能是一个字段;所用的表只能是一个表,如果应用多个表,需写成视图;
--*      排序方式为(ASC.升序;DESC.降序);条件不要加where字样
--*      排序字段只能是一个字段必须是主键
--* 返   回   值:
--***********************************************************************
ALTER PROCEDURE [dbo].[UTIL_GetOnePage2]
 @TABLE      VARCHAR(255),       --所用到的表,一个表或视图
 @COL        VARCHAR(8000),      --要显示的字段列表
 @WHERE   VARCHAR(8000) ,  --所用到的条件,不含 where
 @OKEY  VARCHAR(255) ,  --排序字段,排序字段必须为主键或建立索引。
 @ORDER  VARCHAR(4) = 'ASC', --排序方式
 @GetCount INT = 0,   --0返回记录总数 非0值则返回页记录集,默认全部
 @PAGESIZE INT = 10,           --每页的行数
 @PAGEINDEX INT = 1             --第n页
AS
BEGIN
 DECLARE @CMDSTR  VARCHAR(8000)   --执行语句变量
 DECLARE @WhereCause VARCHAR(8000)   --WHERE子查询语句变量
 DECLARE @WhereOrder VARCHAR(8000)   --WHERE及ORDER子句
 SET NOCOUNT ON

 SET @ORDER = UPPER(LTRIM(RTRIM(@ORDER)))

 --构建WHEER条件语句及WHERE子查询条件
 IF RTRIM(LTRIM(@WHERE)) <> ''
  BEGIN
   SET @WhereCause = ' WHERE ' + @WHERE + ' '
   SET @WhereOrder = '   AND   ' + @WHERE + '   ORDER   BY   ' + @OKEY + '   ' + @ORDER
  END
 ELSE 
  BEGIN
   SET @WhereCause = ' '
   SET @WhereOrder = ' ORDER   BY   ' + @OKEY + '   ' + @ORDER
  END
 --如果仅要求查出总条数,则根据where语句查询后返回
 IF @GetCount = 0
  BEGIN
   SET @CMDSTR = ' '
   SET @CMDSTR = ' SELECT COUNT(*) As Total FROM ' + @TABLE + ' ' + @WhereCause
   EXEC (@CMDSTR)  --AS USER = 'dbo'
   RETURN
  END

 --构建SELECT TOP (N) (LISTFIELDS) FROM (TABLE) (WHERE) (ORDER) 及 (WHERE 子查询)
 --如果不是第一页,

 IF @PAGEINDEX > 1
  BEGIN
   IF UPPER(LTRIM(RTRIM(@ORDER)))  = 'ASC'

    SET   @CMDSTR=
       ' SELECT   TOP ' + CONVERT(NVARCHAR(16),@PAGESIZE) + '   ' + @COL +
       '   FROM   ' + @TABLE +
       '   WHERE   ' + @OKEY + '>' +
       '      (SELECT   MAX   (' + @OKEY + ')   ' +
             'FROM   (SELECT   TOP   '
   ELSE
    SET   @CMDSTR=
       ' SELECT   TOP ' + CONVERT(NVARCHAR(16),@PAGESIZE) + '   ' + @COL +
       '   FROM   ' + @TABLE +
       '   WHERE   ' + @OKEY + '<' +
       '      (SELECT   MIN   (' + @OKEY + ')   ' +
             'FROM   (SELECT   TOP   '
  

   SET   @CMDSTR = @CMDSTR + CONVERT(NVARCHAR,(@PAGEINDEX-1) * @PAGESIZE) + '   ' + @OKEY + '   FROM   ' + @TABLE +  + ' ' + @WhereCause +  '   ORDER   BY   ' + @OKEY + '   ' + @ORDER + ')   AS   T)  ' + @WhereOrder

  END
 ELSE
  SET   @CMDSTR = ' SELECT   TOP ' + CONVERT(NVARCHAR(16),@PAGESIZE) + '   ' + @COL + '   FROM   ' + @TABLE  + '  ' + @WhereCause + '   ORDER   BY   ' + @OKEY + '   ' + @ORDER


 --select @CMDSTR

 --SELECT @CMDSTR
 --执行构建语句,返回结果集
 EXEC(@CMDSTR)  --AS USER = 'dbo'
 SET   NOCOUNT   OFF
END

 

 

 

 

posted @ 2010-01-11 17:06  过错  阅读(285)  评论(0编辑  收藏  举报