`
icarusliu
  • 浏览: 238212 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

高效通用分页存储过程(支持多表关联)

SQL 
阅读更多

改写了下通用存储过程分页,支持多表关联查询与排序.

/****************************************************
**获取分页数据的通用存储过程,支持多表关联查询  
**作者:蔡鸟非菜
**根据sql语句:
**select table1.*,table2.* into #tblTemp from table1,table2 where .. order by id
**select top 10 * from #tblTemp where id >= (select max(id) from (select top ((页码-1)*页大小) id from #tblTemp)
**Function  dbo.TrimColumn(@orderName)  去除字段的前缀  例如 @str = dbo.TrimColumn('A.ID')  则@str为'ID'
*****************************************************/
Create PROCEDURE GetDataPage
        (
        @tblName                varchar(255),                      --表名                         例如:set @tblName = 'table1 A,table2 B'
        @strGetFields           varchar(1000),                     --要显示的列的名称              例如:set @strGetFields = 'A.ID,A.条码,B.仓库名称'
        @orderName              varchar(255),                      --用来排序的字段名称            例如:set @orderName = 'A.ID'
        @orderType              bit,                               --设置排序类型,升序0,其他降序  例如:set @orderType = '0'
        @pageSize               int,                               --页显示的数据条数              例如:set @pageSize = '10'
        @pageIndex              int,                               -- 页码                        例如:set @pageIndex = '1'
        @doCount                bit,                               --返回记录总数,非则返回
        @strWhere               varchar(1500)                      --查询条件                      例如:set @strWhere = 'and A.仓库ID = B.ID'
        )

AS
        declare @strSQL varchar(8000)        -- 存放主SQL语句
        declare @strTmp varchar(110)                 -- 临时变量
        declare @strOrder varchar(400)                 -- 排序类型

        if @DoCount != 0 --需要返回记录总数时
        begin
                if @strWhere != ''
                        set @strSQL = 'select count(*) as Total from ' + @tblName + ' where 1 = 1 ' + @strWhere
                else
                        set @strSQL = 'select count(*) as Total from ' + @tblName + ''        
        end

        else  --不需要返回记录总数时
        begin
                if @orderType != '0'
                begin
                        set @strTmp = '<= (select min'
                        set @strOrder = ' order by ' + @orderName +' desc'
                end
                else
                begin
                        set @strTmp = '>= (select max'
                        set @strOrder = ' order by ' + @orderName +' asc'
                end
                
                
                 -- 查询的如果是第一页时
                if @pageIndex = 1
                begin
                        if @strWhere != ''
                                set @strSQL = 'select top '+ str(@PageSize) + ' ' + @strGetFields + ' from ' + @tblName + ' where 1 = 1 ' + @strWhere + ' ' + @strOrder  
                        else
                                set @strSQL = 'select top '+ str(@PageSize) + ' ' + @strGetFields + ' from ' + @tblName + ' '+ @strOrder
                end
            
                else --不是第一页时
                begin
                        if @orderType != '0'
                        begin
                                set @strOrder = ' order by ' + dbo.TrimColumn(@orderName) +' desc'
                        end
                        else
                        begin
                                set @strOrder = ' order by ' + dbo.TrimColumn(@orderName) +' asc'
                        end

                        set @strSQL = 'select ' + @strGetFields + ' into #tblTemp from ' + @tblName + ' where 1 = 1 ' + @strWhere + ' ' + @strOrder
                                    + ' select top ' + str(@PageSize) + ' * from [#tblTemp] '
                                    + ' where [' + dbo.TrimColumn(@orderName) + '] ' + @strTmp + '(['+ dbo.TrimColumn(@orderName) + ']) from  (select top '
                                    + str((@PageIndex-1)*@PageSize) + ' [' + dbo.TrimColumn(@orderName) + '] from [#tblTemp]) as tblTmp) ' + @strOrder
                                    + ' drop table #tblTemp '
            end  
                
        end
        exec(@strSQL)
        RETURN

分享到:
评论

相关推荐

    通用分页存储过程(支持多表关联)

    效率极高的通用分页存储过程,支持夺表关联。

    oracle查询分页条件通用存储过程

    oracle数据库的查询分页加条件和排序的通用型存储过程,通过将表名以参数的形式传入到存储过程中做到多表通用,也可以是多表关联的sql语句 将其看作一个表也能调用该存储过程,分页只需要传与页数,和每页显示的行数...

    通用的分页存储过程,内置的函数、内连接、左外连接

    在提供的`.sql`文件中,很可能是包含了创建这样一个通用分页存储过程的代码,可能包含示例的使用方法。分析和理解这个文件将有助于进一步理解和应用这些概念。在实际操作中,应根据具体的数据库系统(如MySQL、SQL ...

    Winform 通用分页控件

    【Winform 通用分页控件】 ...通过以上步骤,我们可以构建出一个功能齐全、易用且高效的Winform通用分页控件,满足各种数据展示需求。在实际项目中,这样的控件可以大大提升应用的用户体验和性能。

    GridView通用分页)(.html)

    在这个“GridView通用分页”主题中,我们主要探讨的是如何实现GridView的高效、灵活的分页功能。 分页是提高用户体验的关键因素,特别是在处理大量数据时。GridView内置了分页支持,但默认设置可能不能满足所有需求...

    存储过程实现(可带查询条件/万能分页/通用)

    为了创建一个更通用的分页存储过程,我们可以编写一个名为`[dbo].[UP_GetRecordByPage]`的存储过程,它具有以下几个参数: 1. `@tblName`:表名,允许用户指定要查询的任何表。 2. `@fldName`:主键字段名,通常...

    一个高效简洁的Struts分页方法

    下面将详细解释如何在一个高效简洁的方式下实现Struts分页。 首先,我们需要理解分页的基本原理。分页通常是通过在数据库中限制查询结果的数量,每次只加载一定数量的数据(称为一页),然后根据用户的交互(如点击...

    PHP分页(四种分页方法)类

    创建一个存储过程来处理分页逻辑,可以减少网络传输,提升性能。在存储过程中,可以设置输入参数如每页记录数和当前页码,返回符合条件的数据。然而,使用存储过程可能会增加数据库的维护复杂性。 4. 物理分页 物理...

    Struts分页代码

    通过动态构建WHERE条件、JOIN条件以及ORDER BY子句,代码能够灵活应对不同场景下的分页需求,如多表关联、复杂查询条件等。 ### 总结 Struts框架下的分页实现,不仅依赖于框架本身的机制,还需要深入理解数据库的...

    springboot-mybatis-分页

    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs...

    mysql-pagehelper-通用mapper-easyui-SSM框架示例

    MyBatis作为持久层框架,与SQL紧密关联,允许开发者编写自定义的SQL、存储过程以及高级映射。在本示例中,MyBatis与Spring结合,通过Spring的DataSource配置实现数据库连接。此外,通用Mapper是一个强大的MyBatis...

    php通用网站后台管理.

    实现这一功能通常需要设计角色表、用户表和角色-用户关联表,然后在PHP代码中进行权限检查。 综上所述,这个“php通用网站后台管理”项目涵盖了PHP编程、MySQL数据库设计与管理、jQuery前端交互等多个核心技术点。...

    由php实现的留言本,提供全套详细代码(包含分页)

    6. **分页**:当留言数量过多时,使用分页功能可以提高用户体验。PHP可以通过计算总页数,根据页码查询数据库的部分记录,实现分页显示。这通常用到`LIMIT`和`OFFSET`关键字来限制查询结果的数量。 在提供的...

    纯JS前端实现分页代码

    - **事件绑定**:每个分页按钮都需要关联一个JavaScript函数,例如`indexpage`,该函数接受当前页码作为参数,用于改变页面内容。 - **AJAX请求**:当用户点击分页按钮时,使用`ajaxfunction`发送AJAX请求到后台。...

    经典SQL脚本大全

    │ │ 7.2.3 临时表缓存实现的通用分页存储过程.sql │ │ 7.2.4 使用系统存储过程实现的通用分页存储过程.sql │ │ 7.3.1 实现随机分页的通用分页存储过程.sql │ │ 7.3.2 根据分类表实现的分页存储过程.sql │ ...

    基于PHP的Mysql网页版通用考试成绩查询系统源码.zip

    这些表之间可能存在关联,如学生ID与考试成绩的关联,以便进行关联查询。 4. Web框架:虽然没有明确提到,但通常这样的项目会使用某种PHP框架,如Laravel、CodeIgniter或Yii等,以提高开发效率和代码可维护性。框架...

    LINUX存储管理

    Linux的存储管理系统旨在支持多用户多任务环境,并通过虚拟页式存储的方式为用户提供巨大的虚拟地址空间。在i386平台上,每个进程能够访问高达4GB的虚拟地址空间。 #### 二、Linux存储管理的主要内容 Linux存储...

    ExtJs学习资料22-从服务器获取JSON数据并分页处理.doc

    在本篇ExtJs学习资料中,我们探讨了如何从服务器获取JSON数据并进行分页处理。这是一项在Web应用程序中非常常见的任务,特别是在构建数据密集型界面时。下面我们将详细阐述实现这一功能的关键步骤和涉及的技术点。 ...

    mybatis-plus 源码(mybatis-plus-3.0.zip)

    1. **基础概念**:MyBatis-Plus是一个轻量级的Java框架,主要功能包括自动化 CRUD(创建、读取、更新、删除)操作,支持自定义SQL、存储过程以及丰富的查询条件构造器。 2. **Entity实体类**:在MyBatis-Plus中,...

    ssh 分页代码(延迟加载)

    这里`PageSupport`是自定义的一个分页支持类,用于封装分页参数,如当前页数、每页记录数等。`findByPage`方法接收一个`PageSupport`对象,返回当前页的数据列表。 接着,我们关注`PageSupport.java`。这个类通常...

Global site tag (gtag.js) - Google Analytics