优化后的通用分页存储过程(已更新)

前段时间由于项目需求想上网搜个通用分页存储过程先用着
本以为非常简单的事竟然让我大失所望
竟然没有一个能够满足我的需求,不是效率太低就是限制太多不符合实际需要
bug也是一顿狂冒,更有甚者执行都执行不了
我想应该很多朋友都有这样的遭遇吧
于是一气之下决定自己研究

在众多分析性能的文章中,很庆幸翻到了这一篇http://www.codeproject.com/aspnet/PagingLarge.asp(感谢园子里一位朋友的提示,具体名字已经不记得了),对分页存储过程有兴趣的朋友可以去看,写的很详尽,随便PF一下国外同行的认真和专业.

在上面提到的那篇文章的一开始大力推崇使用RowCoun的t方法,
可是由于原文中提供的方法不支持非unique字段的排序
大多场合都并不适用
文章末尾连作者自己提到,已经开始考虑改用cursor方法
可我对RowCount方法算是情有独中,于是对原文中该方法进行了改进
改进后的方法已基本上满足我的需要,现在发布出来,有用的朋友可以下载试用

修改记录:
    1)增加对非unique字段排序的支持,但必须设定一个PK字段(注:只要是unique字段都可以作为pk字段)
    2)增加记录总数输出参数
    3)修改原过程若干BUG
    4)修改PK字段只能是int型的bug(刚发现的,^_^)

注:
     1)如表名参数为多表连接时,sort列必须指定表名;
     2)只支持单字段排序,有朋友如果问为什么不做成可以多字段排序的,理论上确实有这种可能性,但需要以一定的效率损失为代价,而且会使方法过于复杂,如真有这种需要,完全可以写一个单独的分页存储过程,无论在性能还是复杂度上都比通用要简单.
     3)由于时间原因没有大量测试,如有BUG,请您提出,立刻修正;
     4)由于时间关系,只写了一个简单示例,需要的朋友可以下载
            分页示例

 

  1 None.gif if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[Paging_RowCount] ' and   OBJECTPROPERTY (id, N ' IsProcedure ' =   1 )
  2 None.gif drop   procedure   [ dbo ] . [ Paging_RowCount ]
  3 None.gif GO
  4 None.gif
  5 None.gif SET  QUOTED_IDENTIFIER  ON  
  6 None.gif GO
  7 None.gif SET  ANSI_NULLS  ON  
  8 None.gif GO
  9 None.gif -- -------------------------------------------------------------
 10 None.gif--  分页存储过程(使用RowCount)  --edit by SiBen
 11 None.gif--  summary:
 12 None.gif--           获取表或表集合的分页数据
 13 None.gif--           当多表连接时,sort列必须指定表名        
 14 None.gif-- -------------------------------------------------------------
 15 None.gif
 16 None.gif CREATE   PROCEDURE  Paging_RowCount
 17 None.gif(
 18 None.gif @Tables   varchar ( 1000 ),
 19 None.gif @PK   varchar ( 100 ),
 20 None.gif @Sort   varchar ( 200 =   NULL ,
 21 None.gif @PageNumber   int   =   1 ,
 22 None.gif @PageSize   int   =   10 ,
 23 None.gif @Fields   varchar ( 1000 =   ' * ' ,
 24 None.gif @Filter   varchar ( 1000 =   NULL ,
 25 None.gif @Group   varchar ( 1000 =   NULL ,
 26 None.gif @RecordCount   int   =   0  output 
 27 None.gif)
 28 None.gif AS
 29 None.gif
 30 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Default Sorting*/
 31 None.gif IF   @Sort   IS   NULL   OR   @Sort   =   ''
 32 None.gif     SET   @Sort   =   @PK
 33 None.gif
 34 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Find the @PK type*/
 35 None.gif DECLARE   @SortTable   varchar ( 100 )
 36 None.gif DECLARE   @SortName   varchar ( 100 )
 37 None.gif DECLARE   @PKTable   varchar ( 100 )
 38 None.gif DECLARE   @PKName   varchar ( 100 )
 39 None.gif DECLARE   @strSortColumn   varchar ( 200 )
 40 None.gif DECLARE   @operator   char ( 2 )
 41 None.gif DECLARE   @type   varchar ( 100 )
 42 None.gif DECLARE   @prec   int
 43 None.gif
 44 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Set sorting variables.*/     
 45 None.gif IF   CHARINDEX ( ' DESC ' , @Sort ) > 0
 46 None.gif     BEGIN
 47 None.gif         SET   @strSortColumn   =   REPLACE ( @Sort ' DESC ' '' )
 48 None.gif         SET   @operator   =   ' < '
 49 None.gif     END
 50 None.gif ELSE
 51 None.gif     BEGIN
 52 None.gif         IF   CHARINDEX ( ' ASC ' @Sort >   0
 53 None.gif             SET   @strSortColumn   =   REPLACE ( @Sort ' ASC ' '' )
 54 None.gif                 ELSE
 55 None.gif                         SET   @strSortColumn   =   @Sort
 56 None.gif
 57 None.gif         SET   @operator   =   ' > '
 58 None.gif     END
 59 None.gif
 60 ExpandedBlockStart.gifContractedBlock.gif /**/ /* Set PK,Sort name */
 61 None.gif IF   CHARINDEX ( ' . ' @strSortColumn >   0
 62 None.gif     BEGIN
 63 None.gif         SET   @SortTable   =   SUBSTRING ( @strSortColumn 0 CHARINDEX ( ' . ' , @strSortColumn ))
 64 None.gif         SET   @SortName   =   SUBSTRING ( @strSortColumn CHARINDEX ( ' . ' , @strSortColumn +   1 LEN ( @strSortColumn ))
 65 None.gif     END
 66 None.gif ELSE
 67 None.gif     BEGIN
 68 None.gif         SET   @SortTable   =   @Tables
 69 None.gif         SET   @SortName   =   @strSortColumn
 70 None.gif     END
 71 None.gif IF   CHARINDEX ( ' . ' @PK >   0
 72 None.gif     BEGIN
 73 None.gif         SET   @PKTable   =   SUBSTRING ( @PK 0 CHARINDEX ( ' . ' , @PK ))
 74 None.gif         SET   @PKName   =   SUBSTRING ( @PK CHARINDEX ( ' . ' , @PK +   1 LEN ( @PK ))
 75 None.gif     END
 76 None.gif ELSE
 77 None.gif     BEGIN
 78 None.gif         SET   @PKTable   =   @Tables
 79 None.gif         SET   @PKName   =   @PK
 80 None.gif     END
 81 None.gif
 82 None.gif SELECT   @type = t.name,  @prec = c.prec
 83 None.gif FROM  sysobjects o 
 84 None.gif JOIN  syscolumns c  on  o.id = c.id
 85 None.gif JOIN  systypes t  on  c.xusertype = t.xusertype
 86 None.gif WHERE  o.name  =   @SortTable   AND  c.name  =   @SortName
 87 None.gif
 88 None.gif IF   CHARINDEX ( ' char ' @type >   0
 89 None.gif    SET   @type   =   @type   +   ' ( '   +   CAST ( @prec   AS   varchar +   ' ) '
 90 None.gif
 91 None.gif DECLARE   @strPageSize   varchar ( 50 )
 92 None.gif DECLARE   @strStartRow   varchar ( 50 )
 93 None.gif DECLARE   @strFilter   varchar ( 1000 )
 94 None.gif DECLARE   @strSimpleFilter   varchar ( 1000 )
 95 None.gif DECLARE   @strGroup   varchar ( 1000 )
 96 None.gif
 97 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Default Page Number*/
 98 None.gif IF   @PageNumber   <   1
 99 None.gif     SET   @PageNumber   =   1
100 None.gif
101 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Set paging variables.*/
102 None.gif SET   @strPageSize   =   CAST ( @PageSize   AS   varchar ( 50 ))
103 None.gif SET   @strStartRow   =   CAST ((( @PageNumber   -   1 ) * @PageSize   +   1 AS   varchar ( 50 ))
104 None.gif
105 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Set filter & group variables.*/
106 None.gif IF   @Filter   IS   NOT   NULL   AND   @Filter   !=   ''
107 None.gif     BEGIN
108 None.gif         SET   @strFilter   =   '  WHERE  '   +   @Filter   +   '   '
109 None.gif         SET   @strSimpleFilter   =   '  AND  '   +   @Filter   +   '   '
110 None.gif     END
111 None.gif ELSE
112 None.gif     BEGIN
113 None.gif         SET   @strSimpleFilter   =   ''
114 None.gif         SET   @strFilter   =   ''
115 None.gif     END
116 None.gif IF   @Group   IS   NOT   NULL   AND   @Group   !=   ''
117 None.gif     SET   @strGroup   =   '  GROUP BY  '   +   @Group   +   '   '
118 None.gif ELSE
119 None.gif     SET   @strGroup   =   ''
120 None.gif
121 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Get rows count.*/
122 None.gif DECLARE   @str_Count_SQL   nvarchar ( 500 )
123 None.gif SET   @str_Count_SQL =   ' SELECT @TotalCount=count(*) FROM  '   +   @Tables   +   @strFilter
124 None.gif EXEC  sp_executesql  @str_Count_SQL ,N ' @TotalCount int=0 output ' , @RecordCount  output
125 None.gif    
126 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Execute dynamic query*/     
127 None.gif IF   @PKTable   =   @SortTable   and   @PKName   =   @SortName
128 None.gif     BEGIN   
129 None.gif         EXEC (
130 None.gif         '
131 None.gif        DECLARE @SortColumn  '   +   @type   +   '
132 None.gif        SET ROWCOUNT  '   +   @strStartRow   +   '
133 None.gif        SELECT @SortColumn= '   +   @strSortColumn   +   '  FROM  '   +   @Tables   +   @strFilter   +   '   '   +   @strGroup   +   '  ORDER BY  '   +   @Sort   +   '
134 None.gif        SET ROWCOUNT  '   +   @strPageSize   +   '
135 None.gif        SELECT  '   +   @Fields   +   '  FROM  '   +   @Tables   +   '  WHERE  '   +   @strSortColumn   +   @operator   +   ' = @SortColumn  '   +   @strSimpleFilter   +   '   '   +   @strGroup   +   '  ORDER BY  '   +   @Sort   +   '
136 None.gif         '
137 None.gif        )
138 None.gif     END
139 None.gif ELSE
140 None.gif     BEGIN
141 ExpandedBlockStart.gifContractedBlock.gif                 /**/ /* Get PK Type */
142 None.gif         DECLARE   @pktype   varchar ( 100 )
143 None.gif                 DECLARE   @pkprec   int
144 None.gif        
145 None.gif         SELECT   @pktype = t.name,  @pkprec = c.prec
146 None.gif         FROM  sysobjects o 
147 None.gif         JOIN  syscolumns c  on  o.id = c.id
148 None.gif         JOIN  systypes t  on  c.xusertype = t.xusertype
149 None.gif         WHERE  o.name  =   @PKTable   AND  c.name  =   @PKName
150 None.gif
151 None.gif         IF   CHARINDEX ( ' char ' @pktype >   0
152 None.gif            SET   @pktype   =   @pktype   +   ' ( '   +   CAST ( @pkprec   AS   varchar +   ' ) '
153 None.gif
154 ExpandedBlockStart.gifContractedBlock.gif                 /**/ /*Execute dynamic query*/     
155 None.gif         EXEC (
156 None.gif         '
157 None.gif        DECLARE @SortColumn  '   +   @type   +   '
158 None.gif        DECLARE @SortNullValue  '   +   @type   +   '
159 None.gif        DECLARE @PKStartValue  '   +   @pktype   +   '
160 None.gif        SET @SortNullValue=CAST( ''''  as  ' +   @type   + ' )
161 None.gif        SET ROWCOUNT  '   +   @strStartRow   +   '
162 None.gif        SELECT @SortColumn= isNull( '   +   @strSortColumn   +   ' ,@SortNullValue), @PKStartValue =  ' +   @PK   + '  FROM  '   +   @Tables   +   @strFilter   +   '   '   +   @strGroup   +   '  ORDER BY  '   +   @Sort   +   ' , ' +   @PK   + '  Desc 
163 None.gif        SET ROWCOUNT  '   +   @strPageSize   +   '
164 None.gif        SELECT  '   +   @Fields   +   '  FROM  '   +   @Tables   +   '  WHERE (isNull( '   +   @strSortColumn + ' ,@SortNullValue) '   +   @operator   +   '  @SortColumn or (isNull( '   +   @strSortColumn + ' ,@SortNullValue)=@SortColumn and  ' +   @PK   + ' <=@PKStartValue)) '   +   @strSimpleFilter   +   '   '   +   @strGroup   +   '  ORDER BY  '   +   @Sort   +   ' , ' +   @PK   + '  Desc
165 None.gif         '
166 None.gif        )
167 None.gif     END
168 None.gif GO
169 None.gif SET  QUOTED_IDENTIFIER  OFF  
170 None.gif GO
171 None.gif SET  ANSI_NULLS  ON  
172 None.gif GO
173 None.gif
174 None.gif

转载于:https://www.cnblogs.com/siben168/archive/2006/01/11/314620.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值