首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请高人修改一下这个号称千万数量级的分页存储过程解决办法

2012-02-29 
请高人修改一下这个号称千万数量级的分页存储过程存储过程内容如下:CREATEPROCEDUREXEN_SP_Pagination/*参

请高人修改一下这个号称千万数量级的分页存储过程
存储过程内容如下:


CREATE   PROCEDURE   XEN_SP_Pagination
/*
参数说明:
1.Tables                           :表名称,视图
2.Topnum                         :总查询条数
2.Fields                         :查询字段,默认*
3.PrimaryKey                   :主关键字
4.Sort                               :排序语句,不带Order   By   比如:NewsID   Desc,OrderRows   Asc
5.CurrentPage                 :当前页码
6.PageSize                       :分页尺寸
7.Filter                           :过滤语句,不带Where  
8.Group                             :Group语句,不带Group   By

***************************************************************/
(
@Tables   varchar(1000),
@PrimaryKey   varchar(100),
@Sort   varchar(200)   =   NULL,
@CurrentPage   int   =   1,
@PageSize   int   =   10,
@Topnum   varchar(10)   =   NULL,
@Fields   varchar(1000)   =   '* ',
@Filter   varchar(1000)   =   NULL,
@Group   varchar(1000)   =   NULL
)
AS

/*默认排序*/
IF   @Sort   IS   NULL   OR   @Sort   =   ' '
SET   @Sort   =   @PrimaryKey

DECLARE   @SortTable   varchar(100)
DECLARE   @SortName   varchar(100)
DECLARE   @strSortColumn   varchar(200)
DECLARE   @operator   char(2)
DECLARE   @type   varchar(100)
DECLARE   @prec   int

/*设定排序语句.*/
IF   CHARINDEX( 'DESC ',@Sort)> 0
BEGIN
SET   @strSortColumn   =   REPLACE(@Sort,   'DESC ',   ' ')
SET   @operator   =   ' <= '
END
ELSE
BEGIN
IF   CHARINDEX( 'ASC ',   @Sort)   =   0
SET   @strSortColumn   =   REPLACE(@Sort,   'ASC ',   ' ')
SET   @operator   =   '> = '
END


IF   CHARINDEX( '. ',   @strSortColumn)   >   0
BEGIN
SET   @SortTable   =   SUBSTRING(@strSortColumn,   0,   CHARINDEX( '. ',@strSortColumn))
SET   @SortName   =   SUBSTRING(@strSortColumn,   CHARINDEX( '. ',@strSortColumn)   +   1,   LEN(@strSortColumn))
END
ELSE
BEGIN
SET   @SortTable   =   @Tables
SET   @SortName   =   @strSortColumn
END

SELECT   @type=t.name,   @prec=c.prec
FROM   sysobjects   o  
JOIN   syscolumns   c   on   o.id=c.id
JOIN   systypes   t   on   c.xusertype=t.xusertype
WHERE   o.name   =   @SortTable   AND   c.name   =   @SortName

IF   CHARINDEX( 'char ',   @type)   >   0
      SET   @type   =   @type   +   '( '   +   CAST(@prec   AS   varchar)   +   ') '



DECLARE   @strPageSize   varchar(50)
DECLARE   @strStartRow   varchar(50)
DECLARE   @strFilter   varchar(1000)
DECLARE   @strSimpleFilter   varchar(1000)
DECLARE   @strGroup   varchar(1000)


IF   @Topnum   IS   NOT   NULL   AND   @Topnum   !=   ' '
begin
set   @Topnum   =   'top   '   +@Topnum
end


/*默认当前页*/
IF   @CurrentPage   <   1
SET   @CurrentPage   =   1

/*设置分页参数.*/
SET   @strPageSize   =   CAST(@PageSize   AS   varchar(50))
SET   @strStartRow   =   CAST(((@CurrentPage   -   1)*@PageSize   +   1)   AS   varchar(50))

/*筛选以及分组语句.*/
IF   @Filter   IS   NOT   NULL   AND   @Filter   !=   ' '
BEGIN
SET   @strFilter   =   '   WHERE   '   +   @Filter   +   '   '
SET   @strSimpleFilter   =   '   AND   '   +   @Filter   +   '   '
END
ELSE
BEGIN
SET   @strSimpleFilter   =   ' '
SET   @strFilter   =   ' '
END
IF   @Group   IS   NOT   NULL   AND   @Group   !=   ' '
SET   @strGroup   =   '   GROUP   BY   '   +   @Group   +   '   '
ELSE
SET   @strGroup   =   ' '

/*执行查询语句*/
EXEC(
'
DECLARE   @SortColumn   '   +   @type   +   '
SET   ROWCOUNT   '   +   @strStartRow   +   '
SELECT   '   +   @Topnum   +   '   @SortColumn= '   +   @strSortColumn   +   '   FROM   '   +   @Tables   +   @strFilter   +   '   '   +   @strGroup   +   '   ORDER   BY   '   +   @Sort   +   '
SET   ROWCOUNT   '   +   @strPageSize   +   '
SELECT   '     +   @Topnum   +   @Fields   +   '   FROM   '   +   @Tables   +   '   WHERE   '   +   @strSortColumn   +   @operator   +   '   @SortColumn   '   +   @strSimpleFilter   +   '   '   +   @strGroup   +   '   ORDER   BY   '   +   @Sort   +   '
'
)
GO


我想让其返回2个表,返回的第一个表   是数据分页查询的内容,第二个表是返回的总记录数和分页数

[解决办法]
这个分页存储过程确实可以对千万级的数据量进行分页,但是性能非常差!在小数据量下自己玩玩还行,真正生产场景这种通用分页存储过程没有用的!

热点排行