通用的可带查询条件的SQL语句的分页存储过程

2024-04-13 06:58

本文主要是介绍通用的可带查询条件的SQL语句的分页存储过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

假设数据库中有张表,表名是UserName,字段分别是ID(int),Name(nvarchar),Age(int)。

如果不带查询条件存储过程是:

CREATE PROCEDURE [dbo].[UserName] 
    @pageIndex int, 
    @pageSize int 
AS 
    declare @min int; 
    declare @max int; 
    set @min=@pageSize*(@pageIndex-1)+1; 
    set @max=@pageSize*@pageIndex; 
    with myTable as(select ID,Name,Age,Row_Number() over (order by ID) as rownum from [UserName] ) 
    select ID,Name,Age from myTable where  rownum between @min and @max  
    RETURN

这个分页存储过程很不实用,并且表是固定的。

下面十二个万能分页存储过程,

CREATE PROCEDURE [dbo].[UP_GetRecordByPage] 
@tblName varchar(255), -- 表名 
@fldName varchar(255), -- 主键字段名 
@PageSize int , -- 页尺寸 
@PageIndex int , -- 页码 
@IsReCount bit, -- 返回记录总数, 非 0 值则返回 
@OrderType bit, -- 设置排序类型, 非 0 值则降序 
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where) 
AS 
declare @strSQL varchar(6000) -- 主语句 
declare @strTmp varchar(2000) -- 临时变量(查询条件过长时可能会出错,可修改100为1000) 
declare @strOrder varchar(400) -- 排序类型 
if @OrderType != 0 
    begin 
        set @strTmp = '<(select min' 
        set @strOrder = ' order by [' + @fldName +'] desc' 
    end 
else 
    begin 
        set @strTmp = '>(select max' 
        set @strOrder = ' order by [' + @fldName +'] asc' 
    end 
set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
    + @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
    + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)' 
    + @strOrder 
if @strWhere != '' 
    set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
    + @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
    + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' ' 
    + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder 
if @PageIndex <> 0 
    begin 
        set @strTmp ='' 
        if @strWhere != '' 
        set @strTmp = ' where ' + @strWhere 
        set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
        + @tblName + ']' + @strTmp + ' ' + @strOrder 
        exec (@strSQL) 
    end 
if @IsReCount != 0 
    begin 
        set @strSQL = 'select count(*) as Total from [' + @tblName + ']'+' where ' + @strWhere 
        exec (@strSQL) 
    end

使用方法:

EXEC dbo.UP_GetRecordByPage @tblName = ‘UserName’, -- varchar(255) 
    @fldName = 'ID', -- varchar(255) 
    @PageSize = 2, -- int 
    @PageIndex = 1, -- int 
    @IsReCount = 0, -- bit 
    @OrderType = 1, -- bit 
    @strWhere = 'Age=13' -- varchar(1000)

如果哪里有不正确的地方,欢迎批评指正,共同进步。

这篇关于通用的可带查询条件的SQL语句的分页存储过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899437

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID