两个分页存储过程

SQL万能分页的存储过程 对SQL分页的万能存储过程,很全面的分析和描述,请大家支持 立即下载

CREATE PROC P_viewPage
    /*
        no_mIss 分页存储过程 2007.2.20  QQ:34813284
        适用于单一主键或存在唯一值列的表或视图         
    */

    @TableName VARCHAR(200),     --表名
    @FieldList VARCHAR(2000),    --显示列名
    @PrimaryKey VARCHAR(100),    --单一主键或唯一值键
    @Where VARCHAR(1000),        --查询条件 不含'where'字符
    @Order VARCHAR(1000),        --排序 不含'order by'字符,如id asc,userid desc,当@SortType=3时生效
    @SortType INT,               --排序规则 1:正序asc 2:倒序desc 3:多列排序
    @RecorderCount INT,          --记录总数 0:会返回总记录
    @PageSize INT,               --每页输出的记录数
    @PageIndex INT,              --当前页数
    @TotalCount INT OUTPUT,      --返回记录总数
    @TotalPageCount INT OUTPUT   --返回总页数
AS
    SET NOCOUNT ON
    IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = ''
        OR ISNULL(@PrimaryKey,'') = ''
        OR @SortType < 1 OR @SortType >3
        OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0
    BEGIN       
        RETURN
    END
 
    DECLARE @new_where1 VARCHAR(1000)
    DECLARE @new_where2 VARCHAR(1000)
    DECLARE @new_order VARCHAR(1000)  
    DECLARE @Sql VARCHAR(8000)
    DECLARE @SqlCount NVARCHAR(4000)

    IF ISNULL(@where,'') = ''
        BEGIN
            SET @new_where1 = ' '
            SET @new_where2 = ' WHERE  '
        END
    ELSE
        BEGIN
            SET @new_where1 = ' WHERE ' + @where
            SET @new_where2 = ' WHERE ' + @where + ' AND '
        END

    IF ISNULL(@order,'') = '' OR @SortType = 1  OR @SortType = 2
        BEGIN
            IF @SortType = 1 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' ASC'
            IF @SortType = 2 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' DESC'
        END
    ELSE
        BEGIN
            SET @new_order = ' ORDER BY ' + @Order
        END

    SET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'
                    + CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName + @new_where1
   
    IF @RecorderCount = 0
        BEGIN
         EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',
                               @TotalCount OUTPUT,@TotalPageCount OUTPUT
        END
    ELSE
        BEGIN
         SELECT @TotalCount = @RecorderCount           
        END

    IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)
        BEGIN
            SET @PageIndex =  CEILING((@TotalCount+0.0)/@PageSize)
        END
    IF @PageIndex = 1
        BEGIN
            SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
                       + @TableName + @new_where1 + @new_order
        END
    ELSE
        BEGIN
            IF @SortType = 1
                BEGIN
                    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
                               + @TableName + @new_where2 + @PrimaryKey + ' > '
                               + '(SELECT MAX(' + @PrimaryKey + ') FROM (SELECT TOP '
                               + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
                               + ' FROM ' + @TableName
                               + @new_where1 + @new_order +' ) AS TMP) '+ @new_order
                END
            IF @SortType = 2
                BEGIN
                    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
                               + @TableName + @new_where2 + @PrimaryKey + ' < '
                               + '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '
                               + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
                               +' FROM '+ @TableName
                               + @new_where1 + @new_order + ') AS TMP) '+ @new_order                              
                END      
            IF @SortType = 3
                BEGIN
                    IF CHARINDEX(',',@Order) = 0 BEGIN RETURN END
                    SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
                               + @TableName + @new_where2 + @PrimaryKey + ' NOT IN (SELECT TOP '
                               + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey
                               + ' FROM ' + @TableName + @new_where1 + @new_order + ')'
                               + @new_order
                END
        END
    EXEC(@Sql)
GO

 

CREATE PROC P_public_ViewPage
    /*
        no_mIss 通用分页存储过程 2007.3.1  QQ:34813284
        适用于联合主键/单主键/存在能确定唯一行列/存在能确定唯一行的多列 (用英文,隔开)
        调用:
            第一页查询时返回总记录和总页数及第一页记录:
            EXECUTE P_public_ViewPage_per 'TableName','col1,col2,col3,col4','pk1,pk2,pk3',
                'col5>0 and col7<9','pk1 asc,pk2 asc,pk3 asc',0,10,1,
                @TotalCount OUTPUT,@TotalPageCount OUTPUT
            其它页调用,比如第89页(假设第一页查询时返回总记录为2000000):
            EXECUTE P_public_ViewPage_per 'TableName','col1,col2,col3,col4','pk1,pk2,pk3',
                'col5>0 and col7<9','pk1 asc,pk2 asc,pk3 asc',2000000,10,89,
                @TotalCount OUTPUT,@TotalPageCount OUTPUT
    */

    @TableName VARCHAR(200),     --表名
    @FieldList VARCHAR(2000),    --显示列名
    @PrimaryKey VARCHAR(100),    --单一主键或唯一值键或联合主键列表(用英文,隔开)或能确定唯一行的多列列表(用英文,隔开)
    @Where VARCHAR(1000),        --查询条件 不含'where'字符
    @Order VARCHAR(1000),        --排序 不含'order by'字符,用英文,隔开 
    @RecorderCount INT,          --记录总数 0:会返回总记录
    @PageSize INT,               --每页输出的记录数
    @PageIndex INT,              --当前页数
    @TotalCount INT OUTPUT,      --返回记录总数
    @TotalPageCount INT OUTPUT   --返回总页数
AS

    SET NOCOUNT ON
   
    SET @FieldList = REPLACE(@FieldList,' ','')
    IF @FieldList = '*'
        BEGIN SET @FieldList = 'A.*'END
    ELSE
        BEGIN
            SET @FieldList = 'A.' + REPLACE(@FieldList,',',',A.')
        END
   
    WHILE CHARINDEX(', ',@Order)>0
    BEGIN
        SET @Order = REPLACE(@Order,', ',',')
    END

    IF ISNULL(@TableName,'') = '' OR ISNULL(@PrimaryKey,'') = ''       
        OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0
    BEGIN       
        RETURN
    END
 
    DECLARE @new_where1 VARCHAR(1000)
    DECLARE @new_where2 VARCHAR(1000)
    DECLARE @new_where3 VARCHAR(1000)
    DECLARE @new_where4 VARCHAR(1000)
    DECLARE @new_order1 VARCHAR(1000)
    DECLARE @new_order2 VARCHAR(1000)
    DECLARE @Fields VARCHAR(1000)
    DECLARE @Sql VARCHAR(8000)
    DECLARE @SqlCount NVARCHAR(4000)

    SET @Fields = @PrimaryKey + ','
    SET @new_where2 = ''
    SET @new_where4 = ''


    IF ISNULL(@where,'') = ''
        BEGIN
            SET @new_where1 = ' '
            SET @new_where3 = ' WHERE '
        END
    ELSE
        BEGIN           
            SET @new_where1 = ' WHERE ' + @where + ' '
            SET @new_where3 = ' WHERE 1=1 '
                    + REPLACE(' AND ' + @where,' AND ',' AND A.')+ ' AND '
        END
   
    WHILE CHARINDEX(',',@Fields)>0
    BEGIN
        SET @new_where2 = @new_where2
            + 'A.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1))
            + ' = B.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1)) + ' AND '
        SET @new_where4 = @new_where4
            + 'B.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1)) + ' IS NULL AND '
        SET @Fields = SUBSTRING(@Fields,CHARINDEX(',',@Fields)+1,LEN(@Fields))
    END
    SET @new_where2 = LEFT(@new_where2,LEN(@new_where2)-4)
    SET @new_where4 = LEFT(@new_where4,LEN(@new_where4)-4)

    IF ISNULL(@order,'') = ''
        BEGIN
            SET @new_order1 = ''
            SET @new_order2 = ''
        END
    ELSE
        BEGIN
            SET @new_order1 = ' ORDER BY ' + @Order
            SET @new_order2 = ' ORDER BY '
                    + RIGHT(REPLACE(',' + @Order,',',', A.' ),
                            LEN(REPLACE(',' + @Order,',',', A.' ))-1)
        END

    SET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'
                    + CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName
                    + ' A ' +  @new_where1
   
    IF @RecorderCount = 0
        BEGIN
         EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',
                               @TotalCount OUTPUT,@TotalPageCount OUTPUT
        END
    ELSE
        BEGIN
         SELECT @TotalCount = @RecorderCount           
        END

    IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)
        BEGIN
            SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize)
        END
    IF @PageIndex = 1
        BEGIN
            SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
                       + @TableName + ' A'+ @new_where1 + @new_order1
        END
    ELSE
        BEGIN
            SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '
                       + @TableName + ' A LEFT JOIN (SELECT TOP '
                       + STR(@PageSize*(@PageIndex-1))
                       + ' ' + @PrimaryKey + ' FROM ' + @TableName + @new_where1
                       + @new_order1 + ' )B ON ' + @new_where2 + @new_where3
                       + @new_where4 + @new_order2
        END

EXEC(@Sql)
GO
 

通用Sql分页存储过程 通用sql分页存储过程,提供12参数可供选择。其中,提供两种分页方案被选择和相关排序方式,支持自定义查询、自定义排序等 立即下载

相关推荐

SQL通用分页存储过程完整代码

SQL 通用 分页 存储 过程 完整代码

某分页存储过程

CREATE PROC sp_PageView@tbname sysname, --要分页显示的表名@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段@PageCurrent int=1, --要显示的页码@PageSize int=10,

591

sql server 通用分页存储过程

1.查询返回的表、列名以及排序列没有写死,可以根据需要将这些放到存储过程的输入参数中; 2.适用于所有需要分页的单表或多表联合查询。

实现成千上万的数据的分页

CREATE      proc P_SoBiGo_PercentPage (@tblName   varchar(255)=T_Category,             -- 表名  @strGetFields varchar(1000)=*,       -- 需要返回的列   @fldName varchar(255)=,          -- 排序的字段名  @PageSi

青春奋斗 907

sql2000可用分页存储过程

使用游标实现的sql2000可用分页存储过程,不要增加排序字段

AD9826的时序分析及Verliog代码

AD9826的时序分析及Verliog代码 (本文对AD9826的模式和时序进行了分析,如有错误敬请指正,关于这款ADC芯片的基本参数,本文不做过多介绍) 1、AD9826的模式 AD9826的采样模式主要有两种,一种是“CDS模式”,一种是“SHA模式”;在这两种模式下分别有1通道、2通道、3通道的采样模式 (1)CDS模式 简单的来说CDS模式就是,有两个采样时钟,一个是ADCCLK1,用来采样CCD波形的参考电平,一个是ADCCLK2用来采样数据电平,然后经过,偏移量调节,再经过PGA增益放大最

m0_50102488的博客 6476

sql2000,千万级大数据量分页存储过程效率测试附代码

在项目中,我们经常遇到或用到分页,那么在大数据量(百万级以上)下,哪种分页算法效率最优呢?我们不妨用事实说话。   测试环境 硬件:CPU 酷睿双核T5750  内存:2G 软件:Windows server 2003    +   Sql server 2005   OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTabl

yuan_jie 4090

继电保护整定值计算软件_「全套69份」整定值计算与设计方案

【全套69份】整定值计算与设计方案,输电线路、变压器、发电机、电容器、母线保护等下载方式见文末内容预览:10kV高压电机保护原理及整定计算35kV环网运行线路继电保护整定计算方案分析35KV以下继电保护及三段式电流保护整定计算110 kv电网计算机整定计算新方案220kV两相式电铁牵引站供电线路的短路故障计算及其保护整定原则分析220kV周潮线接地距离保护整定计算特殊方案750 kV变压器保护配置...

weixin_30825953的博客 5013

sql 2000 分页存储过程

set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgo-- [SelectBase] 1,1,'( select j.*,u.P_Name from Job j left join Users u on j.UserID=u.ID) T','Flag=0'            alter procedure [SelectBase]            @Pag...

weixin_34366546的博客 170

大模型事件抽取学习——论文学习笔记《LLMs Learn Task Heuristics from Demonstrations:......》

本篇博客介绍一篇发表在2024 ACL main上的文章:《LLMs Learn Task Heuristics from Demonstrations: A Heuristic-Driven Prompting Strategy for Document-Level Event Argument Extraction》 方向:大模型事件抽取 本篇博客为个人阅读论文的总结与笔记,在这里进行简单的分享 论文链接:https://arxiv.org/abs/

weixin_53751318的博客 1852

第三篇:学习InternVL2.0(探讨代码之训练模块版)

InternVL2的训练模块

qq_69051120的博客 1244

发布两个分页存储过程

两个存储过程的参数是一样的:[Basic_Pagination2005]:只能在SQLServer2005下用;[Basic_Pagination2000]:可在SQLServer2000和SQLServer2005下通用;其中的参数说明在代码中已有注释。需要注意的是当@IsReCount=1时,会返回记录总数。所以在.NET中需用DataSet存放记录集。第一个Ta

青草堂 405

core_analyzer分析c++程序内存占用

环境:centos; 进程:单进程多线程c++程序; 问题:1. 分析系统内存占用; 2. 分析ptmalloc内存空洞(bins上的空闲chunk的大小); 包括:1. 占用了很大内存的c++进程; 2. gcore(在进程不core dump的情况下生成core文件); 3. core_analyzer(分析gcor...

weixin_41644391的博客 4811

目前用到的两个分页存储过程

目前用到的两个分页存储过程:第一个,取得数据总行数CodeCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoALTER PROCEDURE [sq8reyoung]

2713

cartographer ceres后端优化

这里引用一篇文章作用一:用户可以选择使用Problem::AddParameterBlock显式添加参数块;在显式添加的时候ceres会内部进行额外的正确性检查。当Problem::AddParameterBlock()不存在时,Problem::AddResidualBlock()会隐式添加参数块,因此不需要显式调用Problem::AddParameterBlock()函数。ps:类似构造函数,显式构造函数。

南北粉面馆 802

【雷达】基于matlab合成孔径雷达干涉测量(InSAR)时序分析【含Matlab源码 9037期】

合成孔径雷达干涉测量(InSAR)时序分析 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 159

发布两个大数据集通用分页存储过程

发布两个大数据集通用分页存储过程,欢迎大家和我联系共同探讨改进方法,同时我也会及时将更新内容发布在下面的网址http://www.thinksea.com/thinksea/show.aspx?id=92db4c46-2216-4b24-a72b-aa27fcf82e50/*--用存储过程实现的大数据集分页程序显示指定表、视图、查询结果的第X页Copy   Right   2007.09   ht

sz_bdqn的专栏 948

骚戴笔记公告

骚戴笔记公告

我从不打没有准备的仗! 2万+

Oracle两个分页存储过程的比较

由于公司项目上的问题,在数据量很大的时候,在SELECT 语句中包含了很多 function 致使查询进行了全表扫描,例如查询语句:select function1(col1) as a1,function2(col2) as a2,function3(col3) as a3,...... from table1 t1 where col5 = function(col5) 像这种SQ...

diweiqiu7783的博客 157

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

CSS实战核心:选择器优先级、盒模型与渲染时机

CSS不是静态样式表,而是浏览器布局与渲染引擎执行的指令集。理解其底层原理——从选择器匹配的性能开销、盒模型在不同box-sizing下的空间计算逻辑,到margin: 0 auto失效的真实原因——是解决真实项目中样式错乱、跨端不一致、调试困难等问题的关键。掌握层叠规则、渲染触发时机(如transform触发GPU合成)和语义化HTML对样式作用域的影响,能显著提升开发效率与维护性。本文聚焦Web前端工程中高频痛点:响应式圆角切口实现、卡片堆叠动画稳定性、触屏设备hover降级方案,以及CSSOM构建与解

weixin_34130389的博客 252

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 保罗·亨特
下一篇: Windows Scripting Host:脚本语言的通用脚本主机(全文)
no_mIss
博客等级 码龄21年 9粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值