• 分页存储过程:知识与代码


    1.存储过程中的 输出参数
    create proc sp_pager @totalcount int output,@totalpagecount int output
    2.对变量的赋值(set\select)
    select适合对多变量赋值,而set适合给单变量赋值
    select可以将多个值赋给自己,取最后一个,而set只能给单个值赋值
    select对赋值为空的值保持原来的值,而set对赋值为空的值结果为NULL
    set\select赋值后原来的查询执行不返回只将结果给赋值的变量。
    (1).select @name=name,@age=age from t_person
    (2).select name from (select @name=name from t_person)
    3.控制语句
    (1).if语句
    if 条件 or 条件 
    begin
      sql语句
    end
    else
    begin
      sql语句
    end
    if条件可以嵌套
    if @primarykey is null or @primarykey=''
    begin
      select @primarykey=c.name from sys.all_columns c join sys.all._objects o on c.object_id=o.object_id
            where o.name=@tablename and c.column_id=1
    end
    (2).while语句
    while 条件 or 条件
    begin
     sql语句
    end
    while charindex(',',@order)>0 or charindex(',',@order)>0
       begin
          set @order=replace(@order,',' ,',')
       end
    4.charindex函数:查找字符
    charindex(@primarykey,@order) => @order中是否存在@primarykey,返回为int
    5.set nocount on:不返回影响的行 set oncount off:返回影响的行
    6.isnull函数:空值赋值
    isnull(@totalcount,''):如果@totalcount不为NULL则返回@totalcount否则返回''
    7.rtrim\ltrim函数:(右边,左边)去空格
    8.replace函数:替换
    replace(rtrim(ltrim(@fieldlist)),' ',''):将@fieldlist中前后中的空格都去掉
    9.round()\floor()\ceiling()函数
    round() 遵循四舍五入把原值转化为指定小数位数,如:round(1.45,0) = 1;round(1.55,0)=2
    floor()向下舍入为指定小数位数 如:floor(1.45,0)= 1;floor(1.55,0) = 1
    ceiling()向上舍入为指定小数位数 如:ceiling(1.45,0) = 2;ceiling(1.55,0)=210.
    10.substring函数:获取子字符串
    substring(@new_order2,1,len(@new_order2)-1):获取@new_order2中从1到最后位置的字符串 
    11.'<>'/'!=':不等于
    12.str函数:返回一个数字的指定长度的字符串
    str(@number,3,0):返回@number中整数部分为3,小数部分为0的字符串
    也可使用str(@number)则将数字转换为字符串
      1 USE [YLBX]
      2 GO
      3 
      4 /****** Object:  StoredProcedure [dbo].[Sp_Pager]    Script Date: 03/24/2013 23:10:40 ******/
      5 SET ANSI_NULLS ON
      6 GO
      7 
      8 SET QUOTED_IDENTIFIER ON
      9 GO
     10 
     11 
     12 -- =============================================
     13 -- Author:        <Author,,Name>
     14 -- Create date: <Create Date,,>
     15 -- Description:    <Description,,>
     16 -- =============================================
     17 CREATE PROCEDURE [dbo].[Sp_Pager]
     18     -- Add the parameters for the stored procedure here
     19     @TableName VARCHAR(200),     --表名          
     20     @FieldList VARCHAR(2000),    --显示列名,如果是全部字段则为*          
     21     --@PrimaryKey VARCHAR(100),    --单一主键或唯一值键          
     22     @Where VARCHAR(2000)='',        --查询条件 不含'where'字符,如id>10 and len(userid)>9          
     23     @Order VARCHAR(1000)='',        --排序 不含'order by'字符,如id asc,userid desc,必须指定asc或desc          
     24     --注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷          
     25     --@SortType INT=1,               --排序规则 1:正序asc 2:倒序desc 3:多列排序方法          
     26     --@RecorderCount INT=0,          --记录总数 0:会返回总记录          
     27     @PageSize INT=20,               --每页输出的记录数          
     28     @PageIndex INT=1,              --当前页数          
     29     @TotalCount INT OUTPUT ,      --记返回总记录          
     30     @TotalPageCount INT OUTPUT   --返回总页数          
     31 AS
     32 BEGIN
     33     -- SET NOCOUNT ON added to prevent extra result sets from
     34     -- interfering with SELECT statements.
     35     --得到主键
     36     declare @PrimaryKey varchar(2000) --单一主键或唯一值键    
     37     declare @SortType int
     38     declare @RecorderCount int
     39     Select @SortType=1
     40     select @RecorderCount=0
     41     select @PrimaryKey=COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME=@TableName
     42     if @PrimaryKey is null or @PrimaryKey=''
     43     begin
     44         select @PrimaryKey=c.name from sys.all_columns c join sys.all_objects o on c.object_id=o.object_id
     45             where o.name=@TableName and c.column_id=1
     46     end
     47     --
     48     if @Order<>''
     49     begin
     50         if CHARINDEX(@PrimaryKey,@Order)=0 
     51         begin
     52             if CHARINDEX('asc',@Order)=0 and charindex('desc',@Order)=0
     53                 select @order=@order+' asc'
     54             select @Order=@Order+','+@PrimaryKey+' asc'
     55             select @sorttype=3
     56         end
     57         else
     58         begin
     59             if CharIndex(',',@Order)=0
     60             begin
     61                 if CHARINDEX('desc',@order)>0
     62                 begin
     63                     select @sorttype=2
     64                 end
     65             end
     66         end
     67     end
     68     --
     69     SET NOCOUNT ON;
     70 
     71     -- Insert statements for procedure here
     72     IF ISNULL(@TotalCount,'') = '' SET @TotalCount = 0          
     73     SET @Order = RTRIM(LTRIM(@Order))          
     74     SET @PrimaryKey = RTRIM(LTRIM(@PrimaryKey))          
     75     SET @FieldList = REPLACE(RTRIM(LTRIM(@FieldList)),' ','')          
     76     WHILE CHARINDEX(', ',@Order) > 0 or CHARINDEX(' ,',@Order) > 0          
     77         BEGIN          
     78             SET @Order = REPLACE(@Order,', ',',')          
     79             SET @Order = REPLACE(@Order,' ,',',')          
     80         END          
     81     IF ISNULL(@TableName,'') = '' or ISNULL(@FieldList,'') = ''          
     82             or ISNULL(@PrimaryKey,'') = ''          
     83             or @SortType < 1 or @SortType >3          
     84             or @RecorderCount  < 0 or @PageSize < 0 or @PageIndex < 0          
     85         BEGIN          
     86             PRINT('ERR_00')          
     87             RETURN          
     88         END          
     89     IF @SortType = 3          
     90         BEGIN          
     91             IF (UPPER(RIGHT(@Order,4))!=' ASC' AND UPPER(RIGHT(@Order,5))!=' DESC')          
     92                 BEGIN PRINT('ERR_02') RETURN END          
     93         END          
     94     DECLARE @new_where1 VARCHAR(1000)          
     95     DECLARE @new_where2 VARCHAR(1000)          
     96     DECLARE @new_order1 VARCHAR(1000)          
     97     DECLARE @new_order2 VARCHAR(1000)          
     98     DECLARE @new_order3 VARCHAR(1000)          
     99     DECLARE @Sql VARCHAR(8000)          
    100     DECLARE @SqlCount NVARCHAR(4000)          
    101     IF ISNULL(@where,'') = ''          
    102         BEGIN          
    103             SET @new_where1 = ' '          
    104             SET @new_where2 = ' Where  '          
    105         END          
    106     ELSE          
    107         BEGIN          
    108             SET @new_where1 = ' Where ' + @where          
    109             SET @new_where2 = ' Where ' + @where + ' AND '          
    110         END          
    111     IF ISNULL(@order,'') = '' or @SortType = 1  or @SortType = 2          
    112         BEGIN          
    113             IF @SortType = 1          
    114                 BEGIN          
    115                     SET @new_order1 = ' orDER BY ' + @PrimaryKey + ' ASC'          
    116                     SET @new_order2 = ' orDER BY ' + @PrimaryKey + ' DESC'          
    117                 END          
    118             IF @SortType = 2          
    119                 BEGIN          
    120                     SET @new_order1 = ' orDER BY ' + @PrimaryKey + ' DESC'          
    121                     SET @new_order2 = ' orDER BY ' + @PrimaryKey + ' ASC'          
    122                 END          
    123         END          
    124     ELSE          
    125         BEGIN          
    126             SET @new_order1 = ' orDER BY ' + @Order          
    127         END          
    128     
    129     IF @SortType = 3 AND  CHARINDEX(','+@PrimaryKey+' ',','+@Order)>0          
    130     BEGIN          
    131         SET @new_order1 = ' orDER BY ' + @Order          
    132         SET @new_order2 = @Order + ','          
    133         SET @new_order2 = REPLACE(REPLACE(@new_order2,'ASC,','{ASC},'),'DESC,','{DESC},')          
    134         SET @new_order2 = REPLACE(REPLACE(@new_order2,'{ASC},','DESC,'),'{DESC},','ASC,')          
    135         SET @new_order2 = ' orDER BY ' + SUBSTRING(@new_order2,1,LEN(@new_order2)-1)          
    136         IF @FieldList <> '*'          
    137             BEGIN          
    138                 SET @new_order3 = REPLACE(REPLACE(@Order + ',','ASC,',','),'DESC,',',')          
    139                 SET @FieldList = ',' + @FieldList          
    140                 WHILE CHARINDEX(',',@new_order3)>0          
    141                     BEGIN          
    142                         IF CHARINDEX(SUBSTRING(','+@new_order3,1,CHARINDEX(',',@new_order3)),','+@FieldList+',')>0          
    143                             BEGIN          
    144                                 SET @FieldList =          
    145                                 @FieldList + ',' + SUBSTRING(@new_order3,1,CHARINDEX(',',@new_order3))          
    146                             END          
    147                         SET @new_order3 =          
    148                         SUBSTRING(@new_order3,CHARINDEX(',',@new_order3)+1,LEN(@new_order3))          
    149                     END          
    150                 SET @FieldList = SUBSTRING(@FieldList,2,LEN(@FieldList))          
    151             END          
    152         END     
    153          
    154     SET @SqlCount = 'Select @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'          
    155     + CAST(@PageSize AS VARCHAR)+') FROM (Select * FROM ' + @TableName + @new_where1+') AS T'          
    156     IF @RecorderCount  = 0          
    157         BEGIN          
    158             EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',          
    159             @TotalCount OUTPUT,@TotalPageCount OUTPUT          
    160         END          
    161     ELSE          
    162         BEGIN          
    163             Select @TotalCount = @RecorderCount        
    164         END          
    165     IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)          
    166         BEGIN          
    167             SET @PageIndex =  CEILING((@TotalCount+0.0)/@PageSize)          
    168         END          
    169     IF @PageIndex = 1 or @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)          
    170         BEGIN          
    171             IF @PageIndex = 1 --返回第一页数据          
    172                 BEGIN          
    173                     SET @Sql = 'Select * FROM (Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '          
    174                     + @TableName + @new_where1 + @new_order1 +') AS TMP ' + @new_order1    
    175                 END          
    176             IF @PageIndex >= CEILING((@TotalCount+0.0)/@PageSize)  --返回最后一页数据          
    177                 BEGIN          
    178                     SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('          
    179                     + 'Select TOP ' + STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize))          
    180                     + ' ' + @FieldList + ' FROM '          
    181                     + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '          
    182                     + @new_order1          
    183                 END          
    184         END          
    185     ELSE      
    186             
    187         BEGIN          
    188         IF @SortType = 1  --仅主键正序排序          
    189             BEGIN          
    190                 IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索          
    191                     BEGIN          
    192                         SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '          
    193                         + @TableName + @new_where2 + @PrimaryKey + ' > '          
    194                         + '(Select MAX(' + @PrimaryKey + ') FROM (Select TOP '          
    195                         + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey          
    196                         + ' FROM ' + @TableName          
    197                         + @new_where1 + @new_order1 +' ) AS TMP) '+ @new_order1          
    198                     END          
    199                 ELSE  --反向检索          
    200                     BEGIN          
    201                         SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('          
    202                         + 'Select TOP ' + STR(@PageSize) + ' '          
    203                         + @FieldList + ' FROM '          
    204                         + @TableName + @new_where2 + @PrimaryKey + ' < '          
    205                         + '(Select MIN(' + @PrimaryKey + ') FROM (Select TOP '         
    206                         + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey          
    207                         + ' FROM ' + @TableName          
    208                         + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2          
    209                         + ' ) AS TMP ' + @new_order1          
    210                     END          
    211             END          
    212         IF @SortType = 2  --仅主键反序排序          
    213             BEGIN          
    214                 IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索          
    215                     BEGIN          
    216                         SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '          
    217                         + @TableName + @new_where2 + @PrimaryKey + ' < '          
    218                         + '(Select MIN(' + @PrimaryKey + ') FROM (Select TOP '          
    219                         + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey          
    220                         +' FROM '+ @TableName          
    221                         + @new_where1 + @new_order1 + ') AS TMP) '+ @new_order1          
    222                     END          
    223                 ELSE  --反向检索          
    224                     BEGIN          
    225                         SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ('          
    226                         + 'Select TOP ' + STR(@PageSize) + ' '          
    227                         + @FieldList + ' FROM '          
    228                         + @TableName + @new_where2 + @PrimaryKey + ' > '          
    229                         + '(Select MAX(' + @PrimaryKey + ') FROM (Select TOP '          
    230                         + STR(@TotalCount-@PageSize*@PageIndex) + ' ' + @PrimaryKey          
    231                         + ' FROM ' + @TableName          
    232                         + @new_where1 + @new_order2 +' ) AS TMP) '+ @new_order2          
    233                         + ' ) AS TMP ' + @new_order1          
    234                     END          
    235             END          
    236         IF @SortType = 3  --多列排序,必须包含主键,且放置最后,否则不处理          
    237             BEGIN          
    238                 IF CHARINDEX(',' + @PrimaryKey + ' ',',' + @Order) = 0          
    239                     BEGIN PRINT('ERR_02') RETURN END          
    240                     IF @PageIndex <= CEILING((@TotalCount+0.0)/@PageSize)/2  --正向检索          
    241                         BEGIN          
    242                             SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '          
    243                             + 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '          
    244                             + ' Select TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldList          
    245                             + ' FROM ' + @TableName + @new_where1 + @new_order1 + ' ) AS TMP '          
    246                             + @new_order2 + ' ) AS TMP ' + @new_order1          
    247                         END          
    248                     ELSE  --反向检索          
    249                         BEGIN          
    250                             SET @Sql = 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '          
    251                             + 'Select TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ( '          
    252                             + ' Select TOP ' + STR(@TotalCount-@PageSize *@PageIndex+@PageSize) + ' ' + @FieldList          
    253                             + ' FROM ' + @TableName + @new_where1 + @new_order2 + ' ) AS TMP '          
    254                             + @new_order1 + ' ) AS TMP ' + @new_order1          
    255                         END          
    256             END          
    257         END          
    258     PRINT(@SQL)          
    259     EXEC(@Sql)
    260 END
    261 
    262 
    263 GO
  • 相关阅读:
    朴素贝叶斯算法(python)
    《python数据分析基础》之图与图表
    《机器学习实战》之K-近邻算法
    《机器学习实战》之决策树
    决策树算法(python)
    图像的处理
    K-近邻算法(python)
    python实现机器学习的小项目-鸢尾花
    统计学习方法概述
    《python数据分析基础》之数据库
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/dafgdsg435435.html
Copyright © 2020-2023  润新知