分页存储过程

 

ExpandedBlockStart.gif ContractedBlock.gif /**/ /**/ /**/ /*
InBlock.gif说明:1.支持多表查询 2.支持任意排序 3.不支持表别名
InBlock.gif参考了
InBlock.gif    evafly920:[分享]千万数量级分页存储过程(效果演示)
InBlock.gif    地址:http://blog.csdn.net/evafly920/archive/2006/03/03/614813.aspx 
InBlock.gif
InBlock.gifIF(EXISTS(SELECT * FROM sysobjects WHERE [id]=OBJECT_ID('usp_PagingLarge') AND xtype='P'))
InBlock.gif    DROP PROCEDURE usp_PagingLarge
ExpandedBlockEnd.gif
*/

None.gif
None.gif
GO
None.gif
None.gif
CREATE   PROCEDURE  usp_PagingLarge
None.gif
@TableNames   VARCHAR ( 200 ),     -- 表名,可以是多个表,但不能用别名
None.gif
@PrimaryKey   VARCHAR ( 100 ),     -- 主键,可以为空,但@Order为空时该值不能为空
None.gif
@Fields      VARCHAR ( 200 ),         -- 要取出的字段,可以是多个表的字段,可以为空,为空表示select *
None.gif
@PageSize   INT ,             -- 每页记录数
None.gif
@CurrentPage   INT ,         -- 当前页,0表示第1页
None.gif
@Filter   VARCHAR ( 200 =   '' ,     -- 条件,可以为空,不用填 where
None.gif
@Group   VARCHAR ( 200 =   '' ,     -- 分组依据,可以为空,不用填 group by
None.gif
@Order   VARCHAR ( 200 =   ''      -- 排序,可以为空,为空默认按主键升序排列,不用填 order by
None.gif
AS
None.gif
BEGIN
None.gif    
DECLARE   @SortColumn   VARCHAR ( 200 )
None.gif    
DECLARE   @Operator   CHAR ( 2 )
None.gif    
DECLARE   @SortTable   VARCHAR ( 200 )
None.gif    
DECLARE   @SortName   VARCHAR ( 200 )
None.gif    
IF   @Fields   =   ''
None.gif        
SET   @Fields   =   ' * '
None.gif    
IF   @Filter   =   ''
None.gif        
SET   @Filter   =   ' WHERE 1=1 '
None.gif    
ELSE
None.gif        
SET   @Filter   =   ' WHERE  '   +    @Filter
None.gif    
IF   @Group   <> ''
None.gif        
SET   @Group   =   ' GROUP BY  '   +   @Group
None.gif
None.gif    
IF   @Order   <>   ''
None.gif    
BEGIN
None.gif        
DECLARE   @pos1   INT @pos2   INT
None.gif        
SET   @Order   =   REPLACE ( REPLACE ( @Order '  asc ' '  ASC ' ),  '  desc ' '  DESC ' )
None.gif        
IF   CHARINDEX ( '  DESC ' @Order >   0
None.gif            
IF   CHARINDEX ( '  ASC ' @Order >   0
None.gif            
BEGIN
None.gif                
IF   CHARINDEX ( '  DESC ' @Order <   CHARINDEX ( '  ASC ' @Order )
None.gif                    
SET   @Operator   =   ' <= '
None.gif                
ELSE
None.gif                    
SET   @Operator   =   ' >= '
None.gif            
END
None.gif            
ELSE
None.gif                
SET   @Operator   =   ' <= '
None.gif        
ELSE
None.gif            
SET   @Operator   =   ' >= '
None.gif        
SET   @SortColumn   =   REPLACE ( REPLACE ( REPLACE ( @Order '  ASC ' '' ),  '  DESC ' '' ),  '   ' '' )
None.gif        
SET   @pos1   =   CHARINDEX ( ' , ' @SortColumn )
None.gif        
IF   @pos1   >   0
None.gif            
SET   @SortColumn   =   SUBSTRING ( @SortColumn 1 @pos1 - 1 )
None.gif        
SET   @pos2   =   CHARINDEX ( ' . ' @SortColumn )
None.gif        
IF   @pos2   >   0
None.gif        
BEGIN
None.gif            
SET   @SortTable   =   SUBSTRING ( @SortColumn 1 @pos2 - 1 )
None.gif            
IF   @pos1   >   0  
None.gif                
SET   @SortName   =   SUBSTRING ( @SortColumn @pos2 + 1 @pos1 - @pos2 - 1 )
None.gif            
ELSE
None.gif                
SET   @SortName   =   SUBSTRING ( @SortColumn @pos2 + 1 LEN ( @SortColumn ) - @pos2 )
None.gif        
END
None.gif        
ELSE
None.gif        
BEGIN
None.gif            
SET   @SortTable   =   @TableNames
None.gif            
SET   @SortName   =   @SortColumn
None.gif        
END
None.gif    
END
None.gif    
ELSE
None.gif    
BEGIN
None.gif        
SET   @SortColumn   =   @PrimaryKey
None.gif        
SET   @SortTable   =   @TableNames
None.gif        
SET   @SortName   =   @SortColumn
None.gif        
SET   @Order   =   @SortColumn
None.gif        
SET   @Operator   =   ' >= '
None.gif    
END
None.gif
None.gif    
DECLARE   @type   varchar ( 50 )
None.gif    
DECLARE   @prec   int
None.gif    
SELECT   @type = t.name,  @prec = c.prec
None.gif    
FROM  sysobjects o 
None.gif    
JOIN  syscolumns c  on  o.id = c.id
None.gif    
JOIN  systypes t  on  c.xusertype = t.xusertype
None.gif    
WHERE  o.name  =   @SortTable   AND  c.name  =   @SortName
None.gif    
IF   CHARINDEX ( ' char ' @type >   0
None.gif    
SET   @type   =   @type   +   ' ( '   +   CAST ( @prec   AS   varchar +   ' ) '
None.gif
None.gif    
DECLARE   @TopRows   INT
None.gif    
SET   @TopRows   =   @PageSize   *   @CurrentPage   +   1
None.gif    
print   @TopRows
None.gif    
print   @Operator
None.gif    
EXEC ( '
None.gif        DECLARE @SortColumnBegin 
'   +   @type   +   '
None.gif        SET ROWCOUNT 
'   +   @TopRows   +   '
None.gif        SELECT @SortColumnBegin=
'   +   @SortColumn   +   '  FROM   '   +   @TableNames   +   '   '   +   @Filter   +   '   '   +   @Group   +   '  ORDER BY  '   +   @Order   +   '
None.gif        SET ROWCOUNT 
'   +   @PageSize   +   '
None.gif        SELECT 
'   +   @Fields   +   '  FROM   '   +   @TableNames   +   '   '   +   @Filter    +   '  AND  '   +   @SortColumn   +   ''   +   @Operator   +   ' @SortColumnBegin  '   +   @Group   +   '  ORDER BY  '   +   @Order   +   '     
None.gif    
' )    
None.gif
END
None.gif
None.gif
GO
None.gif
None.gif
-- 调用例子:
None.gif
     -- 1.单表/单排序
None.gif
     EXEC  usp_PagingLarge  ' bigtable ' , ' d_id ' , ' d_id,d_title,d_content,d_time ' , 20 , 1 , '' , '' , ' d_id desc '
None.gif    
-- 2.单表/多排序
None.gif
     EXEC  usp_PagingLarge  ' bigtable ' , ' d_id ' , ' * ' , 20 , 0 , '' , '' , ' d_time asc,d_id desc '
None.gif    
-- 3.多表/单排序
None.gif
     EXEC  usp_PagingLarge  ' bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id ' ' bigtable.d_id ' ' bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author ' 20 0 '' '' ' bigtable.d_id asc '
None.gif    
-- 4.多表/多排序
None.gif
     EXEC  usp_PagingLarge  ' bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id ' ' bigtable.d_id ' ' bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author ' 20 0 '' '' ' bigtable.d_time asc,bigtable.d_id desc '

 

与自定义分页结合例子:
/Files/jiny-z/Paging_Custom.rar
None.gif alter   PROCEDURE  SP_Pagination
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*
InBlock.gif***************************************************************
InBlock.gif** 分页存储过程 **
InBlock.gif***************************************************************
InBlock.gif参数说明:
InBlock.gif1.Tables :表名称,视图
InBlock.gif2.PrimaryKey :主关键字
InBlock.gif3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
InBlock.gif4.CurrentPage :当前页码
InBlock.gif5.PageSize :分页尺寸
InBlock.gif6.Fields:字段
InBlock.gif6.Filter :过滤语句,不带Where 
InBlock.gif7.Group :Group语句,不带Group By
InBlock.gif8.docount: 1返回总行数,0返回列表
InBlock.gif
ExpandedBlockEnd.gif**************************************************************
*/

None.gif(
None.gif
@Tables   varchar ( 1000 ),
None.gif
@PrimaryKey   varchar ( 100 ),
None.gif
@Sort   varchar ( 200 =   NULL ,
None.gif
@CurrentPage   int   =   1 ,
None.gif
@PageSize   int   =   10 ,
None.gif
@Fields   varchar ( 1000 =   ' * ' ,
None.gif
@Filter   varchar ( 1000 =   NULL ,
None.gif
@Group   varchar ( 1000 =   NULL ,
None.gif
@docount   bit   =   0
None.gif)
None.gif
AS
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*默认排序*/
None.gif
IF   @Sort   IS   NULL   OR   @Sort   =   ''
None.gif
SET   @Sort   =   @PrimaryKey
None.gif
DECLARE   @SortTable   varchar ( 100 )
None.gif
DECLARE   @SortName   varchar ( 100 )
None.gif
DECLARE   @strSortColumn   varchar ( 200 )
None.gif
DECLARE   @operator   char ( 2 )
None.gif
DECLARE   @type   varchar ( 100 )
None.gif
DECLARE   @prec   int
None.gif
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*设定排序语句.*/
None.gif
IF   CHARINDEX ( ' DESC ' , @Sort ) > 0
None.gif 
BEGIN
None.gif  
SET   @strSortColumn   =   REPLACE ( @Sort ' DESC ' '' )
None.gif  
SET   @operator   =   ' <= '
None.gif 
END
None.gif
ELSE
None.gif 
BEGIN
None.gif 
IF   CHARINDEX ( ' ASC ' @Sort =   0
None.gif  
SET   @strSortColumn   =   REPLACE ( @Sort ' ASC ' '' )
None.gif  
SET   @operator   =   ' >= '
None.gif 
END
None.gif
IF   CHARINDEX ( ' . ' @strSortColumn >   0
None.gif 
BEGIN
None.gif  
SET   @SortTable   =   SUBSTRING ( @strSortColumn 0 CHARINDEX ( ' . ' , @strSortColumn ))
None.gif  
SET   @SortName   =   SUBSTRING ( @strSortColumn CHARINDEX ( ' . ' , @strSortColumn +   1 LEN ( @strSortColumn ))
None.gif 
END
None.gif
ELSE
None.gif 
BEGIN
None.gif  
SET   @SortTable   =   @Tables
None.gif  
SET   @SortName   =   @strSortColumn
None.gif 
END
None.gif
None.gif
SELECT   @type = t.name,  @prec = c.prec
None.gif
FROM  sysobjects o 
None.gif
JOIN  syscolumns c  on  o.id = c.id
None.gif
JOIN  systypes t  on  c.xusertype = t.xusertype
None.gif
WHERE  o.name  =   @SortTable   AND  c.name  =   @SortName
None.gif
None.gif
IF   CHARINDEX ( ' char ' @type >   0
None.gif 
SET   @type   =   @type   +   ' ( '   +   CAST ( @prec   AS   varchar +   ' ) '
None.gif
None.gif
DECLARE   @strPageSize   varchar ( 50 )
None.gif
DECLARE   @strStartRow   varchar ( 50 )
None.gif
DECLARE   @strFilter   varchar ( 200 )
None.gif
DECLARE   @strSimpleFilter   varchar ( 200 )
None.gif
DECLARE   @strGroup   varchar ( 200 )
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*默认当前页*/
None.gif
IF   @CurrentPage   <   1
None.gif 
SET   @CurrentPage   =   1
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*设置分页参数.*/
None.gif
SET   @strPageSize   =   CAST ( @PageSize   AS   varchar ( 50 ))
None.gif
SET   @strStartRow   =   CAST ((( @CurrentPage   -   1 ) * @PageSize   +   1 AS   varchar ( 50 ))
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*筛选以及分组语句.*/
None.gif
IF   @Filter   IS   NOT   NULL   AND   @Filter   !=   ''
None.gif 
BEGIN
None.gif  
SET   @strFilter   =   '  WHERE  '   +   @Filter   +   '   '
None.gif  
SET   @strSimpleFilter   =   '  AND  '   +   @Filter   +   '   '
None.gif 
END
None.gif
ELSE
None.gif 
BEGIN
None.gif  
SET   @strSimpleFilter   =   ''
None.gif  
SET   @strFilter   =   ''
None.gif 
END
None.gif
None.gif
IF   @Group   IS   NOT   NULL   AND   @Group   !=   ''
None.gif 
SET   @strGroup   =   '  GROUP BY  '   +   @Group   +   '   '
None.gif
ELSE
None.gif 
SET   @strGroup   =   ''
None.gif
None.gif 
None.gif
None.gif
declare   @cTemp   NVarChar ( 1000 )
None.gif
declare   @PageCount   int ,   @lineCount   decimal
None.gif
None.gif
CREATE   TABLE  # temp (linecount  INT )
None.gif
None.gif
set   @cTemp   =   ' insert into #temp (linecount)  select  count(*)  FROM  '   +   @Tables   +    @strFilter   +   '   '   +   @strGroup  
None.gif 
None.gif
exec  ( @cTemp )
None.gif
None.gif
select   @lineCount   =  linecount  from  # temp
None.gif
None.gif
drop   table  # temp
None.gif
None.gif
None.gif
if ( @docount = 1 )  
None.gif 
begin
None.gif  
select   @lineCount   ' 总行数 '  
None.gif 
end
None.gif
else   
None.gif
None.gif
begin
None.gif 
None.gif 
-- 得到总页数
None.gif
  set   @PageCount   =   CEILING ( @lineCount / @strPageSize )
None.gif 
if   @CurrentPage   >   @PageCount
None.gif  
begin
None.gif   
set   @cTemp   =   ' SELECT  '   +   @Fields   +   '  FROM  '   +   @Tables   +   '  WHERE 1>2  '  
None.gif  
end
None.gif 
else
None.gif  
begin
None.gif   
ExpandedBlockStart.gifContractedBlock.gif   
/**/ /*执行查询语句*/
None.gif   
None.gif   
set   @cTemp   =   ' DECLARE @SortColumn  '   +   @type   +   '
None.gif   SET ROWCOUNT 
'   +   @strStartRow   +   '
None.gif   SELECT @SortColumn=
'   +   @strSortColumn   +   '  FROM  '   +   @Tables   +   @strFilter   +   '   '   +   @strGroup   +   '  ORDER BY  '   +   @Sort   +   '
None.gif   SET ROWCOUNT 
'   +   @strPageSize   +   '
None.gif   SELECT 
'   +   @Fields   +   '  FROM  '   +   @Tables   +   '  WHERE  '   +   @strSortColumn   +   @operator   +   '  @SortColumn  '   +   @strSimpleFilter   +   '   '   +   @strGroup   +   '  ORDER BY  '   +   @Sort   +   ''
None.gif   
None.gif  
end
None.gif
None.gif 
-- print @cTemp
None.gif
  EXEC ( @cTemp )
None.gif
end  
None.gif
None.gif
-- ---------------------------------------------------
None.gif

None.gif

 

None.gif 分页查询的方法已经很多很多,在这里我也加入成为其中一员。
None.gif      SQL Server中有一个Set Rowcount的的设置,它的意思是使命令的处理在响应指定的行数之后停止处理命令,利用这个特点,我们可以借用它来在一个千万行级数据表中实现高性能分页查询。先来说说实现方式:
None.gif      
1 、我们来假定Table中有一个已经建立了索引的主键字段ID(整数型),我们将按照这个字段来取数据进行分页。
None.gif      
2 、页的大小我们放在 @PageSize中
None.gif      
3 、当前页号我们放在 @CurrentPage中
None.gif      
4 、如何让记录指针快速滚动到我们要取的数据开头的那一行呢,这是关键所在!有了Set  RowCount ,我们就很容易实现了。
None.gif      
5 、如果我们成功地滚动记录指针到我们要取的数据的开头的那一行,然后我们把那一行的记录的ID字段的值记录下来,那么,利用Top和条件,我们就很容易的得到指定页的数据了。当然,有了Set  RowCount ,我们难道还用Top么?
None.gif      看看Set Rowcount怎么来帮我们的忙吧:
None.gif
None.gif
Declare   @ID   int
None.gif
Declare   @MoveRecords   int
None.gif
None.gif
-- @CurrentPage和@PageSize是传入参数
None.gif
Set   @MoveRecords = @CurrentPage   *   @PageSize + 1
None.gif
None.gif
-- 下面两行实现快速滚动到我们要取的数据的行,并把ID记录下来
None.gif
Set   Rowcount   @MoveRecords
None.gif
Select   @ID = ID  from  Table1  Order   by  ID
None.gif
None.gif
Set   Rowcount   @PageSize
None.gif
-- 最恨为了减少麻烦使用*了,但是在这里为了说明方便,暂时用一下
None.gif
Select   *   From  Table1  Where  ID >= @ID   Order   By  ID
None.gif
Set   Rowcount   0
None.gif      大家可以试试看,在一个1千W记录的表里面,一下子方翻页到第100页(每页100条),看看有多快!
None.gif

 

None.gif 分享]千万数量级分页存储过程(带效果演示)
None.gif效果演示:http:
// www.cn5135.com / _App / Opportunities / QueryResult.aspx
None.gif
None.gif
CREATE   PROCEDURE  CN5135_SP_Pagination
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*
InBlock.gif***************************************************************
InBlock.gif** 千万数量级分页存储过程 **
InBlock.gif***************************************************************
InBlock.gif参数说明:
InBlock.gif1.Tables :表名称,视图
InBlock.gif2.PrimaryKey :主关键字
InBlock.gif3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
InBlock.gif4.CurrentPage :当前页码
InBlock.gif5.PageSize :分页尺寸
InBlock.gif6.Filter :过滤语句,不带Where 
InBlock.gif7.Group :Group语句,不带Group By
InBlock.gif效果演示:http://www.cn5135.com/_App/Opportunities/QueryResult.aspx
ExpandedBlockEnd.gif**************************************************************
*/

None.gif(
None.gif
@Tables   varchar ( 1000 ),
None.gif
@PrimaryKey   varchar ( 100 ),
None.gif
@Sort   varchar ( 200 =   NULL ,
None.gif
@CurrentPage   int   =   1 ,
None.gif
@PageSize   int   =   10 ,
None.gif
@Fields   varchar ( 1000 =   ' * ' ,
None.gif
@Filter   varchar ( 1000 =   NULL ,
None.gif
@Group   varchar ( 1000 =   NULL
None.gif)
None.gif
AS
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*默认排序*/
None.gif
IF   @Sort   IS   NULL   OR   @Sort   =   ''
None.gif
SET   @Sort   =   @PrimaryKey
None.gif
DECLARE   @SortTable   varchar ( 100 )
None.gif
DECLARE   @SortName   varchar ( 100 )
None.gif
DECLARE   @strSortColumn   varchar ( 200 )
None.gif
DECLARE   @operator   char ( 2 )
None.gif
DECLARE   @type   varchar ( 100 )
None.gif
DECLARE   @prec   int
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*设定排序语句.*/
None.gif
IF   CHARINDEX ( ' DESC ' , @Sort ) > 0
None.gif
BEGIN
None.gif
SET   @strSortColumn   =   REPLACE ( @Sort ' DESC ' '' )
None.gif
SET   @operator   =   ' <= '
None.gif
END
None.gif
ELSE
None.gif
BEGIN
None.gif
IF   CHARINDEX ( ' ASC ' @Sort =   0
None.gif
SET   @strSortColumn   =   REPLACE ( @Sort ' ASC ' '' )
None.gif
SET   @operator   =   ' >= '
None.gif
END
None.gif
IF   CHARINDEX ( ' . ' @strSortColumn >   0
None.gif
BEGIN
None.gif
SET   @SortTable   =   SUBSTRING ( @strSortColumn 0 CHARINDEX ( ' . ' , @strSortColumn ))
None.gif
SET   @SortName   =   SUBSTRING ( @strSortColumn CHARINDEX ( ' . ' , @strSortColumn +   1 LEN ( @strSortColumn ))
None.gif
END
None.gif
ELSE
None.gif
BEGIN
None.gif
SET   @SortTable   =   @Tables
None.gif
SET   @SortName   =   @strSortColumn
None.gif
END
None.gif
SELECT   @type = t.name,  @prec = c.prec
None.gif
FROM  sysobjects o 
None.gif
JOIN  syscolumns c  on  o.id = c.id
None.gif
JOIN  systypes t  on  c.xusertype = t.xusertype
None.gif
WHERE  o.name  =   @SortTable   AND  c.name  =   @SortName
None.gif
IF   CHARINDEX ( ' char ' @type >   0
None.gif
SET   @type   =   @type   +   ' ( '   +   CAST ( @prec   AS   varchar +   ' ) '
None.gif
DECLARE   @strPageSize   varchar ( 50 )
None.gif
DECLARE   @strStartRow   varchar ( 50 )
None.gif
DECLARE   @strFilter   varchar ( 1000 )
None.gif
DECLARE   @strSimpleFilter   varchar ( 1000 )
None.gif
DECLARE   @strGroup   varchar ( 1000 )
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*默认当前页*/
None.gif
IF   @CurrentPage   <   1
None.gif
SET   @CurrentPage   =   1
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*设置分页参数.*/
None.gif
SET   @strPageSize   =   CAST ( @PageSize   AS   varchar ( 50 ))
None.gif
SET   @strStartRow   =   CAST ((( @CurrentPage   -   1 ) * @PageSize   +   1 AS   varchar ( 50 ))
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*筛选以及分组语句.*/
None.gif
IF   @Filter   IS   NOT   NULL   AND   @Filter   !=   ''
None.gif
BEGIN
None.gif
SET   @strFilter   =   '  WHERE  '   +   @Filter   +   '   '
None.gif
SET   @strSimpleFilter   =   '  AND  '   +   @Filter   +   '   '
None.gif
END
None.gif
ELSE
None.gif
BEGIN
None.gif
SET   @strSimpleFilter   =   ''
None.gif
SET   @strFilter   =   ''
None.gif
END
None.gif
IF   @Group   IS   NOT   NULL   AND   @Group   !=   ''
None.gif
SET   @strGroup   =   '  GROUP BY  '   +   @Group   +   '   '
None.gif
ELSE
None.gif
SET   @strGroup   =   ''
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*执行查询语句*/
None.gif
EXEC (
None.gif
'
None.gifDECLARE @SortColumn 
'   +   @type   +   '
None.gifSET ROWCOUNT 
'   +   @strStartRow   +   '
None.gifSELECT @SortColumn=
'   +   @strSortColumn   +   '  FROM  '   +   @Tables   +   @strFilter   +   '   '   +   @strGroup   +   '  ORDER BY  '   +   @Sort   +   '
None.gifSET ROWCOUNT 
'   +   @strPageSize   +   '
None.gifSELECT 
'   +   @Fields   +   '  FROM  '   +   @Tables   +   '  WHERE  '   +   @strSortColumn   +   @operator   +   '  @SortColumn  '   +   @strSimpleFilter   +   '   '   +   @strGroup   +   '  ORDER BY  '   +   @Sort   +   '
None.gif
'
None.gif)
None.gif
GO

 

 

注:
     1)如表名参数为多表连接时,sort列必须指定表名;
     2)只支持单字段排序,有朋友如果问为什么不做成可以多字段排序的,理论上确实有这种可能性,但需要以一定的效率损失为代价,而且会使方法过于复杂,如真有这种需要,完全可以写一个单独的分页存储过程,无论在性能还是复杂度上都比通用要简单.
     3) 对非unique字段排序的支持,但必须设定一个PK字段(注:只要是unique字段都可以作为pk字段)


  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   @strSortColumn   varchar ( 200 )
 38 None.gif DECLARE   @operator   char ( 2 )
 39 None.gif DECLARE   @type   varchar ( 100 )
 40 None.gif DECLARE   @prec   int
 41 None.gif
 42 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Set sorting variables.*/     
 43 None.gif IF   CHARINDEX ( ' DESC ' , @Sort ) > 0
 44 None.gif     BEGIN
 45 None.gif         SET   @strSortColumn   =   REPLACE ( @Sort ' DESC ' '' )
 46 None.gif         SET   @operator   =   ' < '
 47 None.gif     END
 48 None.gif ELSE
 49 None.gif     BEGIN
 50 None.gif         IF   CHARINDEX ( ' ASC ' @Sort >   0
 51 None.gif             SET   @strSortColumn   =   REPLACE ( @Sort ' ASC ' '' )
 52 None.gif                 ELSE
 53 None.gif                         SET   @strSortColumn   =   @Sort
 54 None.gif
 55 None.gif         SET   @operator   =   ' > '
 56 None.gif     END
 57 None.gif
 58 None.gif
 59 None.gif IF   CHARINDEX ( ' . ' @strSortColumn >   0
 60 None.gif     BEGIN
 61 None.gif         SET   @SortTable   =   SUBSTRING ( @strSortColumn 0 CHARINDEX ( ' . ' , @strSortColumn ))
 62 None.gif         SET   @SortName   =   SUBSTRING ( @strSortColumn CHARINDEX ( ' . ' , @strSortColumn +   1 LEN ( @strSortColumn ))
 63 None.gif     END
 64 None.gif ELSE
 65 None.gif     BEGIN
 66 None.gif         SET   @SortTable   =   @Tables
 67 None.gif         SET   @SortName   =   @strSortColumn
 68 None.gif     END
 69 None.gif
 70 None.gif SELECT   @type = t.name,  @prec = c.prec
 71 None.gif FROM  sysobjects o 
 72 None.gif JOIN  syscolumns c  on  o.id = c.id
 73 None.gif JOIN  systypes t  on  c.xusertype = t.xusertype
 74 None.gif WHERE  o.name  =   @SortTable   AND  c.name  =   @SortName
 75 None.gif
 76 None.gif IF   CHARINDEX ( ' char ' @type >   0
 77 None.gif    SET   @type   =   @type   +   ' ( '   +   CAST ( @prec   AS   varchar +   ' ) '
 78 None.gif
 79 None.gif DECLARE   @strPageSize   varchar ( 50 )
 80 None.gif DECLARE   @strStartRow   varchar ( 50 )
 81 None.gif DECLARE   @strFilter   varchar ( 1000 )
 82 None.gif DECLARE   @strSimpleFilter   varchar ( 1000 )
 83 None.gif DECLARE   @strGroup   varchar ( 1000 )
 84 None.gif
 85 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Default Page Number*/
 86 None.gif IF   @PageNumber   <   1
 87 None.gif     SET   @PageNumber   =   1
 88 None.gif
 89 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Set paging variables.*/
 90 None.gif SET   @strPageSize   =   CAST ( @PageSize   AS   varchar ( 50 ))
 91 None.gif SET   @strStartRow   =   CAST ((( @PageNumber   -   1 ) * @PageSize   +   1 AS   varchar ( 50 ))
 92 None.gif
 93 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Set filter & group variables.*/
 94 None.gif IF   @Filter   IS   NOT   NULL   AND   @Filter   !=   ''
 95 None.gif     BEGIN
 96 None.gif         SET   @strFilter   =   '  WHERE  '   +   @Filter   +   '   '
 97 None.gif         SET   @strSimpleFilter   =   '  AND  '   +   @Filter   +   '   '
 98 None.gif     END
 99 None.gif ELSE
100 None.gif     BEGIN
101 None.gif         SET   @strSimpleFilter   =   ''
102 None.gif         SET   @strFilter   =   ''
103 None.gif     END
104 None.gif IF   @Group   IS   NOT   NULL   AND   @Group   !=   ''
105 None.gif     SET   @strGroup   =   '  GROUP BY  '   +   @Group   +   '   '
106 None.gif ELSE
107 None.gif     SET   @strGroup   =   ''
108 None.gif
109 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Get rows count.*/
110 None.gif DECLARE   @str_Count_SQL   nvarchar ( 500 )
111 None.gif SET   @str_Count_SQL =   ' SELECT @TotalCount=count(*) FROM  '   +   @Tables   +   @strFilter
112 None.gif EXEC  sp_executesql  @str_Count_SQL ,N ' @TotalCount int=0 output ' , @RecordCount  output
113 None.gif    
114 ExpandedBlockStart.gifContractedBlock.gif /**/ /*Execute dynamic query*/     
115 None.gif IF   @Sort   =   @PK
116 None.gif     BEGIN
117 None.gif         EXEC (
118 None.gif         '
119 None.gif        DECLARE @SortColumn  '   +   @type   +   '
120 None.gif        SET ROWCOUNT  '   +   @strStartRow   +   '
121 None.gif        SELECT @SortColumn= '   +   @strSortColumn   +   '  FROM  '   +   @Tables   +   @strFilter   +   '   '   +   @strGroup   +   '  ORDER BY  '   +   @Sort   +   '
122 None.gif        SET ROWCOUNT  '   +   @strPageSize   +   '
123 None.gif        SELECT  '   +   @Fields   +   '  FROM  '   +   @Tables   +   '  WHERE  '   +   @strSortColumn   +   @operator   +   ' = @SortColumn  '   +   @strSimpleFilter   +   '   '   +   @strGroup   +   '  ORDER BY  '   +   @Sort   +   '
124 None.gif         '
125 None.gif        )
126 None.gif     END
127 None.gif ELSE
128 None.gif     BEGIN
129 None.gif         EXEC (
130 None.gif         '
131 None.gif        DECLARE @SortColumn  '   +   @type   +   '
132 None.gif        DECLARE @SortNullValue  '   +   @type   +   '
133 None.gif        DECLARE @PKStartValue int
134 None.gif        SET @SortNullValue=CAST( ''''  as  ' +   @type   + ' )
135 None.gif        SET ROWCOUNT  '   +   @strStartRow   +   '
136 None.gif        SELECT @SortColumn= isNull( '   +   @strSortColumn   +   ' ,@SortNullValue), @PKStartValue =  ' +   @PK   + '  FROM  '   +   @Tables   +   @strFilter   +   '   '   +   @strGroup   +   '  ORDER BY  '   +   @Sort   +   ' , ' +   @PK   + '  Desc 
137 None.gif        SET ROWCOUNT  '   +   @strPageSize   +   '
138 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
139 None.gif         '
140 None.gif        )
141 None.gif     END
142 None.gif GO
143 None.gif SET  QUOTED_IDENTIFIER  OFF  
144 None.gif GO
145 None.gif SET  ANSI_NULLS  ON  
146 None.gif GO
147 None.gif
148 None.gif
http://www.codeproject.com/aspnet/PagingLarge.asp
None.gif 邹建的存储过程
None.gif
ALTER   PROC  PageView
None.gif
@tbname      sysname,            -- 要分页显示的表名
None.gif
@FieldKey    sysname,            -- 用于定位记录的主键(惟一键)字段,只能是单个字段
None.gif
@PageCurrent   int = 1 ,              -- 要显示的页码
None.gif
@PageSize     int = 10 ,             -- 每页的大小(记录数)
None.gif
@FieldShow    nvarchar ( 1000 ) = '' ,   -- 以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
None.gif
@FieldOrder    nvarchar ( 1000 ) = '' -- 以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
None.gif
                                           -- 用于指定排序顺序
None.gif
@Where       nvarchar ( 1000 ) = '' ,   -- 查询条件
None.gif
@PageCount    int  OUTPUT         -- 总页数
None.gif
AS
None.gif
DECLARE   @sql   nvarchar ( 4000 )
None.gif
SET  NOCOUNT  ON
None.gif
-- 检查对象是否有效
None.gif
IF   OBJECT_ID ( @tbname IS   NULL
None.gif
BEGIN
None.gif
RAISERROR (N ' 对象"%s"不存在 ' , 1 , 16 , @tbname )
None.gif
RETURN
None.gif
END
None.gif
IF   OBJECTPROPERTY ( OBJECT_ID ( @tbname ),N ' IsTable ' ) = 0
None.gif
AND   OBJECTPROPERTY ( OBJECT_ID ( @tbname ),N ' IsView ' ) = 0
None.gif
AND   OBJECTPROPERTY ( OBJECT_ID ( @tbname ),N ' IsTableFunction ' ) = 0
None.gif
BEGIN
None.gif
RAISERROR (N ' "%s"不是表、视图或者表值函数 ' , 1 , 16 , @tbname )
None.gif
RETURN
None.gif
END
None.gif
None.gif
-- 分页字段检查
None.gif
IF   ISNULL ( @FieldKey ,N '' ) = ''
None.gif
BEGIN
None.gif
RAISERROR (N ' 分页处理需要主键(或者惟一键) ' , 1 , 16 )
None.gif
RETURN
None.gif
END
None.gif
None.gif
-- 其他参数检查及规范
None.gif
IF   ISNULL ( @PageCurrent , 0 ) < 1   SET   @PageCurrent = 1
None.gif
IF   ISNULL ( @PageSize , 0 ) < 1   SET   @PageSize = 10
None.gif
IF   ISNULL ( @FieldShow ,N '' ) = N ''   SET   @FieldShow = N ' * '
None.gif
IF   ISNULL ( @FieldOrder ,N '' ) = N ''
None.gif
SET   @FieldOrder = N ''
None.gif
ELSE
None.gif
SET   @FieldOrder = N ' ORDER BY  ' + LTRIM ( @FieldOrder )
None.gif
IF   ISNULL ( @Where ,N '' ) = N ''
None.gif
SET   @Where = N ''
None.gif
ELSE
None.gif
SET   @Where = N ' WHERE ( ' + @Where + N ' ) '
None.gif
None.gif
-- 如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
None.gif
IF   @PageCount   IS   NULL
None.gif
BEGIN
None.gif
SET   @sql = N ' SELECT @PageCount=COUNT(*) '
None.gif
+ N '  FROM  ' + @tbname
None.gif
+ N '   ' + @Where
None.gif
EXEC  sp_executesql  @sql ,N ' @PageCount int OUTPUT ' , @PageCount  OUTPUT
None.gif
SET   @PageCount = ( @PageCount + @PageSize - 1 ) / @PageSize
None.gif
END
None.gif
None.gif
-- 计算分页显示的TOPN值
None.gif
DECLARE   @TopN   varchar ( 20 ), @TopN1   varchar ( 20 )
None.gif
SELECT   @TopN = @PageSize ,
None.gif
@TopN1 = @PageCurrent * @PageSize
None.gif
None.gif
-- 第一页直接显示
None.gif
IF   @PageCurrent = 1
None.gif
EXEC (N ' SELECT TOP  ' + @TopN
None.gif
+ N '   ' + @FieldShow
None.gif
+ N '  FROM  ' + @tbname
None.gif
+ N '   ' + @Where
None.gif
+ N '   ' + @FieldOrder )
None.gif
ELSE
None.gif
BEGIN
None.gif
SELECT   @PageCurrent = @TopN1 ,
None.gif
@sql = N ' SELECT @n=@n-1,@s=CASE WHEN @n< ' + @TopN
None.gif
+ N '  THEN @s+N '' , '' +QUOTENAME(RTRIM(CAST( ' + @FieldKey
None.gif
+ N '  as varchar(8000))),N '''''''' ) ELSE N ''''  END FROM  ' + @tbname
None.gif
+ N '   ' + @Where
None.gif
+ N '   ' + @FieldOrder
None.gif
SET   ROWCOUNT   @PageCurrent
None.gif
EXEC  sp_executesql  @sql ,
None.gifN
' @n int,@s nvarchar(4000) OUTPUT ' ,
None.gif
@PageCurrent , @sql  OUTPUT
None.gif
SET   ROWCOUNT   0
None.gif
IF   @sql = N ''
None.gif
EXEC (N ' SELECT TOP 0 '
None.gif
+ N '   ' + @FieldShow
None.gif
+ N '  FROM  ' + @tbname )
None.gif
ELSE
None.gif
BEGIN
None.gif
SET   @sql = STUFF ( @sql , 1 , 1 ,N '' )
None.gif
-- 执行查询
None.gif
EXEC (N ' SELECT TOP  ' + @TopN
None.gif
+ N '   ' + @FieldShow
None.gif
+ N '  FROM  ' + @tbname
None.gif
+ N '  WHERE  ' + @FieldKey
None.gif
+ N '  IN( ' + @sql
None.gif
+ N ' ' + @FieldOrder )
None.gif
END
None.gif
END
None.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值