• 千万数量级分页存储过程


      1 set ANSI_NULLS ON
      2 
      3 set QUOTED_IDENTIFIER ON
      4 go
      5 ALTER     PROCEDURE  [dbo].[PRO_PAGEDATA]
      6 /*
      7 ***************************************************************
      8 ** 千万数量级分页存储过程 **
      9 ***************************************************************
     10 参数说明:
     11 1.Tables :表名称,视图
     12 2.PrimaryKey :主关键字
     13 3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
     14 4.CurrentPage :当前页码
     15 5.PageSize :分页尺寸
     16 6.Filter :过滤语句,不带Where
     17 7.Group :Group语句,不带Group By
     18 8.TotalCount 返回记录总数
     19 ***************************************************************/
     20 (
     21 @Tables  varchar ( 1000 ),
     22 @PrimaryKey  varchar ( 100 ),
     23 @Sort  varchar ( 200 ) =  NULL ,
     24 @CurrentPage  int  =  1 ,
     25 @PageSize  int  =  10 ,
     26 @Fields  varchar ( 1000 ) =  '*' ,
     27 @Filter  varchar ( 1000 ) =  NULL ,
     28 @Group varchar ( 1000 ) =  NULL,
     29 @TotalCount int output
     30 )
     31 AS
     32 
     33 /*默认排序*/
     34 
     35 IF  @Sort  IS NULL OR  @Sort =  ''
     36 SET  @Sort = @PrimaryKey
     37 DECLARE  @SortTable  varchar ( 100 )
     38 DECLARE  @SortName  varchar ( 100 )
     39 DECLARE  @strSortColumn  varchar ( 200 )
     40 DECLARE  @operator  char ( 2 )
     41 DECLARE  @type  varchar ( 100 )
     42 DECLARE  @prec  int
     43 
     44 /*设定排序语句.*/
     45 
     46 IF  CHARINDEX'DESC' ,@Sort)> 0
     47 BEGIN
     48 SET  @strSortColumn = REPLACE(@Sort,  'DESC' ,  '' )
     49 SET  @operator =  '<='
     50 END
     51 
     52 ELSE
     53 BEGIN
     54 IF  CHARINDEX'ASC' , @Sort=  0
     55 SET  @strSortColumn = REPLACE(@Sort,  'ASC' ,  '' )
     56 SET  @operator =  '>='
     57 END
     58 
     59 IF  CHARINDEX'.' , @strSortColumn>  0
     60 BEGIN
     61 SET  @SortTable = SUBSTRING(@strSortColumn,  0 , CHARINDEX'.' ,@strSortColumn))
     62 SET  @SortName = SUBSTRING(@strSortColumnCHARINDEX'.' ,@strSortColumn+  1 , LEN(@strSortColumn))
     63 END
     64 ELSE
     65 BEGIN
     66 SET  @SortTable = @Tables
     67 SET  @SortName = @strSortColumn
     68 END
     69 SELECT  @type=t.name, @prec=c.prec
     70 FROM  sysobjects o
     71 JOIN  syscolumns c  on  o.id=c.id
     72 JOIN  systypes t  on  c.xusertype=t.xusertype
     73 WHERE  o.name = @SortTable  AND  c.name = @SortName
     74 IF  CHARINDEX'char' , @type>  0
     75 SET  @type = @type +  '('  +  CAST (@prec  AS varchar ) +  ')'
     76 DECLARE  @strPageSize  varchar ( 50 )
     77 DECLARE  @strStartRow  varchar ( 50 )
     78 DECLARE  @strFilter  varchar ( 1000 )
     79 DECLARE  @strSimpleFilter  varchar ( 1000 )
     80 DECLARE  @strGroup  varchar ( 1000 )
     81 
     82 /*默认当前页*/
     83 IF  @CurrentPage <  1
     84 SET  @CurrentPage =  1
     85 /*设置分页参数.*/
     86 SET  @strPageSize =  CAST (@PageSize  AS varchar ( 50 ))
     87 SET  @strStartRow =  CAST (((@CurrentPage -  1 )*@PageSize +  1 )  AS varchar ( 50 ))
     88 
     89 /*筛选以及分组语句.*/
     90 declare @strSQL nvarchar(4000)
     91 
     92 IF  @Filter  IS NOT NULL AND  @Filter !=  ''
     93 BEGIN
     94 SET  @strFilter =  ' WHERE '  + @Filter +  ' '
     95 SET  @strSimpleFilter =  ' AND '  + @Filter +  ' '
     96 set @strSQL = ' select @TotalCount=count(*) from '+@Tables+' where '+@Filter+''
     97 END
     98 
     99 ELSE
    100 BEGIN
    101 
    102 SET  @strSimpleFilter =  ''
    103 SET  @strFilter =  ''
    104 set @strSQL = ' select @TotalCount=count(*) from '+@Tables+''
    105 END
    106 IF  @Group IS NOT NULL AND  @Group  !=  ''
    107 SET  @strGroup =  ' GROUP BY '  + @Group  +  ' '
    108 ELSE
    109 SET  @strGroup =  ''
    110 
    111 --统计总条数 
    112 
    113 /*声明查询字符串*/
    114 
    115 /*
    116 
    117 set @strSQL='
    118 
    119 DECLARE @SortColumn '  + @type +  '
    120 
    121 SET ROWCOUNT '  + @strStartRow +  '
    122 
    123 SELECT @SortColumn='  + @strSortColumn +  ' FROM '  + @Tables + @strFilter +  ' '  + @strGroup +  ' ORDER BY '  + @Sort +  '
    124 
    125 SET ROWCOUNT '  + @strPageSize +  '
    126 
    127 SELECT '  + @Fields +  'FROM '  + @Tables +  ' WHERE '  + @strSortColumn + @operator +  ' @SortColumn '  + @strSimpleFilter +  ' '  + @strGroup +  ' ORDER BY '  + @Sort +  '
    128 
    129 '
    130 
    131 */
    132 
    133 /*取得查询结果总数*/
    134  exec sp_executesql
    135  @strSQL
    136  N'@TotalCount int=0 OUTPUT'
    137  @TotalCount=@TotalCount OUTPUT 
    138 /*执行查询语句*/
    139 
    140 EXEC (
    141 '
    142 DECLARE @SortColumn '  + @type +  '
    143 SET ROWCOUNT '  + @strStartRow +  '
    144 SELECT @SortColumn='  + @strSortColumn +  ' FROM '  + @Tables + @strFilter +  ' '  + @strGroup +  ' ORDER BY '  + @Sort +  '
    145 SET ROWCOUNT '  + @strPageSize +  '
    146 SELECT '  + @Fields +  'FROM '  + @Tables +  ' WHERE '  + @strSortColumn + @operator +  ' @SortColumn '  + @strSimpleFilter +  ' '  + @strGroup +  ' ORDER BY '  + @Sort +  '
    147 '
    148 )
  • 相关阅读:
    网曝!互联网公司那些老司机才懂的秘密~~
    中国IT行业薪资:与销售相比,程序员真得很“穷”
    太简单了,教你去掉Java代码中烦人的“!=null”
    怎么判断自己在不在一家好公司?
    内部泄露版!互联网大厂的薪资和职级一览
    重磅!GitHub突然宣布,对全球人免费开放全部核心功能
    痛心!Pandownload开发者被抓!我终于决定使用Docker搭建一个多端同步网盘!
    退税:我承认我有赌的成分
    golang实现的简单优先队列
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)解答
  • 原文地址:https://www.cnblogs.com/zhangpan1244/p/2353959.html
Copyright © 2020-2023  润新知