• 较好的分页存储过程


    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    
    
    --drop procedure p_page 
    --go 
    
    ALTER procedure [dbo].[CutPage_PRO] 
    
    ( 
    @Tables varchar(1000), --表名如testtable (如果是联合查询不要用as ,只用表名果如 table1 left join table2)
    @PrimaryKey varchar(100),--表的主键,必须唯一性 (联合查询时名表加字段名如:table1.id)
    @Sort varchar(200) = NULL,--排序字段如f_Name asc或f_name desc(注意只能有一个排序字段)(联合查询时表名加字段: table1.id) 
    @CurrentPage int = 1,--当前页 
    @PageSize int = 10,---每页大小 
    @Fields varchar(1000) = '*',--显示的字段列表 (联合查询时表名.字段名如:table1.name,table1.age,table2.lvl,table2.gender)
    @Filter varchar(1000) = NULL,--条件语句,不加where,如 f_id>3 
    @Group varchar(1000) = NULL,--分组字段 
    @TotalPage int output --返回总页数 
    ) 
    
    --WITH ENCRYPTION ---加密存储 
    
    AS 
    
    
    
    SET NOCOUNT ON 
    Declare @intResult Int 
    
    Begin Tran 
    
    DECLARE @sql nvarchar(4000) 
    
    if @Filter is null or @Filter='' 
    set @Sql = 'select @intResult = count(' + @PrimaryKey + ') from ' + @Tables 
    else 
    set @Sql = 'select @intResult = count(' + @PrimaryKey + ') from ' + @Tables + ' where + ' + @Filter 
    
    EXEC sp_executesql @sql,N'@intResult int OUTPUT',@intResult OUTPUT--计算总记录数 
    select @TotalPage=CEILING((@intResult+0.0)/@PageSize)--计算总页数 
    
    
    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 
    IF CHARINDEX('ASC', @Sort) > 0 
    BEGIN 
    SET @strSortColumn = REPLACE(@Sort, 'ASC', '') 
    SET @operator = '>=' 
    END 
    
    ELSE 
    BEGIN 
    SET @strSortColumn = @SORT 
    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 @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 = '' 
    
    set @sql = 'DECLARE @SortColumn ' + @type + ' 
    SET ROWCOUNT ' + @strStartRow + ' 
    Select @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' orDER BY ' + @Sort + ' 
    SET ROWCOUNT ' + @strPageSize + ' 
    Select ' + @Fields + ' FROM ' + @Tables + ' Where ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' orDER BY ' + @Sort + ' '
    
    --print @sql 
    
    exec(@sql) 
    
    
    If @@Error <> 0 
    Begin 
    RollBack Tran 
    Return -1 
    End 
    Else 
    Begin 
    Commit Tran 
    Return @intResult ---返回记录总数 
    End 
    
    ---------------------------eg-------------
    /*
    Declare @@intResult Int 
    exec CutPage_PRO 
    ' TreavlPlan left join Book on Book.id=TreavlPlan.planid ',
    'TreavlPlan.id',
    'TreavlPlan.id desc',
    2,
    2,
    '*',
    'TreavlPlan.userid=1',
    '',
    @@intResult
    */
    
    
    
  • 相关阅读:
    深入MySQL(一):MySQL的组织架构
    使用graalvm nativeimage 快速暴露jar 代码为native 共享库
    SQL注入__布尔盲注和时间盲注 菜鸟
    linux网络配置,无法解析或者打开软件包列表
    django入门视图
    三.面试题
    select,poll,epoll的区别以及使用方法
    Linux从入门到入坑
    品味Spring Cache设计之美
    JAVA_基础篇(1)_JDK 8 的下载、安装与配置
  • 原文地址:https://www.cnblogs.com/wenming205/p/1683590.html
Copyright © 2020-2023  润新知