您当前的位置: 首页 >  sql

暂无认证

  • 0浏览

    0关注

    100387博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

[MSSQL]SQL通用存储过程分页,支持多表联合

发布时间:2012-08-30 15:24:12 ,浏览量:0

注意:该存储过程处理逻辑被发现有严重错误,并不能实现 任意排序等功能。
/**/ /* 说明:1.支持多表查询 2.支持任意排序 3.不支持表别名 参考了     evafly920:[分享]千万数量级分页存储过程(效果演示)     地址:http://blog.csdn.net/evafly920/archive/2006/03/03/614813.aspx  IF(EXISTS(SELECT * FROM sysobjects WHERE [id]=OBJECT_ID('usp_PagingLarge') AND xtype='P'))     DROP PROCEDURE usp_PagingLarge */ GO CREATE   PROCEDURE  usp_PagingLarge @TableNames   VARCHAR ( 200 ),     -- 表名,可以是多个表,但不能用别名 @PrimaryKey   VARCHAR ( 100 ),     -- 主键,可以为空,但@Order为空时该值不能为空 @Fields      VARCHAR ( 200 ),         -- 要取出的字段,可以是多个表的字段,可以为空,为空表示select * @PageSize   INT ,             -- 每页记录数 @CurrentPage   INT ,         -- 当前页,0表示第1页 @Filter   VARCHAR ( 200 )  =   '' ,     -- 条件,可以为空,不用填 where @Group   VARCHAR ( 200 )  =   '' ,     -- 分组依据,可以为空,不用填 group by @Order   VARCHAR ( 200 )  =   ''      -- 排序,可以为空,为空默认按主键升序排列,不用填 order by AS BEGIN      DECLARE   @SortColumn   VARCHAR ( 200 )      DECLARE   @Operator   CHAR ( 2 )      DECLARE   @SortTable   VARCHAR ( 200 )      DECLARE   @SortName   VARCHAR ( 200 )      IF   @Fields   =   ''          SET   @Fields   =   ' * '      IF   @Filter   =   ''          SET   @Filter   =   ' WHERE 1=1 '      ELSE          SET   @Filter   =   ' WHERE  '   +    @Filter      IF   @Group   <> ''          SET   @Group   =   ' GROUP BY  '   +   @Group      IF   @Order   <>   ''      BEGIN          DECLARE   @pos1   INT ,  @pos2   INT          SET   @Order   =   REPLACE ( REPLACE ( @Order ,  '  asc ' ,  '  ASC ' ),  '  desc ' ,  '  DESC ' )          IF   CHARINDEX ( '  DESC ' ,  @Order )  >   0              IF   CHARINDEX ( '  ASC ' ,  @Order )  >   0              BEGIN                  IF   CHARINDEX ( '  DESC ' ,  @Order )  <   CHARINDEX ( '  ASC ' ,  @Order )                      SET   @Operator   =   ' <= '                  ELSE                      SET   @Operator   =   ' >= '              END              ELSE                  SET   @Operator   =   ' <= '          ELSE              SET   @Operator   =   ' >= '          SET   @SortColumn   =   REPLACE ( REPLACE ( REPLACE ( @Order ,  '  ASC ' ,  '' ),  '  DESC ' ,  '' ),  '   ' ,  '' )          SET   @pos1   =   CHARINDEX ( ' , ' ,  @SortColumn )          IF   @pos1   >   0              SET   @SortColumn   =   SUBSTRING ( @SortColumn ,  1 ,  @pos1 - 1 )          SET   @pos2   =   CHARINDEX ( ' . ' ,  @SortColumn )          IF   @pos2   >   0          BEGIN              SET   @SortTable   =   SUBSTRING ( @SortColumn ,  1 ,  @pos2 - 1 )              IF   @pos1   >   0                    SET   @SortName   =   SUBSTRING ( @SortColumn ,  @pos2 + 1 ,  @pos1 - @pos2 - 1 )              ELSE                  SET   @SortName   =   SUBSTRING ( @SortColumn ,  @pos2 + 1 ,  LEN ( @SortColumn ) - @pos2 )          END          ELSE          BEGIN              SET   @SortTable   =   @TableNames              SET   @SortName   =   @SortColumn          END      END      ELSE      BEGIN          SET   @SortColumn   =   @PrimaryKey          SET   @SortTable   =   @TableNames          SET   @SortName   =   @SortColumn          SET   @Order   =   @SortColumn          SET   @Operator   =   ' >= '      END      DECLARE   @type   varchar ( 50 )      DECLARE   @prec   int      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   @TopRows   INT      SET   @TopRows   =   @PageSize   *   @CurrentPage   +   1      print   @TopRows      print   @Operator      EXEC ( '         DECLARE @SortColumnBegin  '   +   @type   +   '         SET ROWCOUNT  '   +   @TopRows   +   '         SELECT @SortColumnBegin= '   +   @SortColumn   +   '  FROM   '   +   @TableNames   +   '   '   +   @Filter   +   '   '   +   @Group   +   '  ORDER BY  '   +   @Order   +   '         SET ROWCOUNT  '   +   @PageSize   +   '         SELECT  '   +   @Fields   +   '  FROM   '   +   @TableNames   +   '   '   +   @Filter    +   '  AND  '   +   @SortColumn   +   ''   +   @Operator   +   ' @SortColumnBegin  '   +   @Group   +   '  ORDER BY  '   +   @Order   +   '           ' )     END GO -- 调用例子:      -- 1.单表/单排序      EXEC  usp_PagingLarge  ' bigtable ' , ' d_id ' , ' d_id,d_title,d_content,d_time ' , 20 , 1 , '' , '' , ' d_id desc '      -- 2.单表/多排序      EXEC  usp_PagingLarge  ' bigtable ' , ' d_id ' , ' * ' , 20 , 0 , '' , '' , ' d_time asc,d_id desc '      -- 3.多表/单排序      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 '      -- 4.多表/多排序      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
关注
打赏
1655516835
查看更多评论
立即登录/注册

微信扫码登录

0.0802s