一个Sql Server 的游标与循环嵌套的存储过程用例

一个Sql Server 的游标与循环嵌套的存储过程用例

准备代码


--创建表
CREATE TABLE everyoneAVG
(
    ID int primary key identity(1,1),
    AccNo INT,
    AVGTime INT,
    AddTimes INT
);

DROP TABLE everyoneAVG;

SELECT ID,AccNo AS ‘用户号‘,AVGTime/60 AS ‘平均充值时间间隔(小时)‘,AddTimes AS ‘总充值次数‘
FROM everyoneAVG
ORDER BY AVGTime/60 DESC;

DELETE everyoneAVG;

功能需求

查询出一个时间段内每个人的平均充值时间间隔

实现代码



CREATE PROCEDURE P_getAVGAddTime

AS
BEGIN
DECLARE
    @AccountNo INT, --账户号

    @AVGTime INT,   --每个人平均充值间隔时间(分钟)
    @AddTimes INT,  --每个人总充值次数(忽略十分钟内的充值)
    @upConsumeTime DATETIME,    --前一次成交时间
    @ConsumeTime DATETIME,  --当前成交时间
    @TempTime INT   --临时记录累加的间隔时间(分钟)

    --声明用户号游标
    DECLARE allAcc_cursor CURSOR FOR
    SELECT top 99.9999 percent AccountNo
    FROM [CASH].[dbo].[tb_Customer]
    ORDER BY AccountNo

    OPEN allAcc_cursor  --打开游标
    FETCH NEXT FROM allAcc_cursor   --获取游标下一行数据
    INTO @AccountNo --使变量获取当前游标指定行的账户号

    -----------外部游标,ORDER BY AccountNo
    WHILE(@@FETCH_STATUS=0)
    BEGIN

        SET @TempTime=0
        SET @AVGTime=0  --每个人平均充值时间赋初值
        SET @AddTimes=0 --每个人充值次数赋初值
        SET @upConsumeTime=‘2017-11-09 00:00:00.000‘

        DECLARE ConsumeTime_Cursor CURSOR FOR   --声明成交时间

        --充值记录查询
        SELECT top 99.9999 percent ConsumeTime
        FROM [CASH].[dbo].[tb_inf]
        WHERE [email protected] AND GrpNo=98 AND ExChgDate>=‘2017-11-09 00:00:00.000‘ AND ExChgDate<=‘2018-04-16 00:00:00.000‘
        ORDER BY ConsumeTime

        OPEN ConsumeTime_Cursor --打开成交时间游标
        FETCH NEXT FROM ConsumeTime_Cursor --获取下一行数据
        INTO @ConsumeTime

        WHILE(@@FETCH_STATUS=0)
        BEGIN
            --首次充值处理
            IF(@upConsumeTime=‘2017-11-09 00:00:00.000‘)
            BEGIN
                SET @[email protected]
                SET @[email protected]+1
            END

            ELSE
            IF(DATEDIFF(MINUTE,@upConsumeTime,@ConsumeTime)<10) ----十分钟内的充值时间忽略
            BEGIN
                SET @[email protected]
            END

            ELSE
            BEGIN
                SET @[email protected]+1   --充值次数累加
                SET @[email protected]+DATEDIFF(MINUTE,@upConsumeTime,@ConsumeTime)    --充值时间间隔累加
                SET @[email protected]
            END

        FETCH NEXT FROM ConsumeTime_Cursor --获取下一行数据
        INTO @ConsumeTime
        END

        --仅充值一次或从未充值
        IF(@AddTimes=1)
        BEGIN
            SET @AVGTime=0
        END
        ELSE
        BEGIN
            SET @[email protected]/(@AddTimes-1)
        END
        --将得到的平均值存入临时表
        BEGIN
            INSERT INTO [CASH].[dbo].[everyoneAVG]
            VALUES(@AccountNo,@AVGTime,@AddTimes)
        END

        CLOSE ConsumeTime_Cursor    --关闭内部游标
        DEALLOCATE ConsumeTime_Cursor   --释放内部游标

    FETCH NEXT FROM allAcc_cursor   --获取游标下一行数据
    INTO @AccountNo --使变量获取当前游标指定行的账户号
    END
    CLOSE allAcc_cursor --关闭外部游标
    DEALLOCATE allAcc_cursor    --释放外部游标

END
GO


一个Sql Server 的游标与循环嵌套的存储过程用例

原文地址:http://blog.51cto.com/13710467/2105344

时间: 2024-10-20 09:55:45

一个Sql Server 的游标与循环嵌套的存储过程用例的相关文章

微软MVP攻略 (如何成为MVP?一个SQL Server MVP的经验之谈)

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 初衷 什么是微软MVP? 成为微软MVP的条件? 如何成为微软MVP? (一) 申请时间划分 (二) 前期准备 (三) 下载/填写申请表格 (四) 申请MVP (五) 各种资料的填写 微软MVP奖项及权益包括什么? 成为微软MVP之后 个人建议 互动资讯 二.初衷 搞微软技术的,大家或多或少都有听说过微软的“最有价值专家”(MVP),网上也有不少资料对这个称谓做了介绍,但是都是一些大体的描述,并没有更加细节方面的,比

如何使用OPENQUERY访问另一个SQL Server

原文:如何使用OPENQUERY访问另一个SQL Server 在项目中,经常会遇到一个数据库访问另一个数据库,[CNVFERPDB]为服务器名,[CE3]为库名 1 SELECT Dtl.* 2 FROM CNVFERPDB. CE3.ce3.ZTLE0125 Dtl 3 INNER JOIN CNVFERPDB.CE3.ce3.ZTLE0124 Mst 4 ON Dtl.RECVSUPPNO = Mst.RECVSUPPNO AND Dtl.MANDT = Mst.MANDT 5 WHERE

sql server 2000 单主键高效分页存储过程 (支持多字段排序)

sql server 2000 单主键高效分页存储过程 (支持多字段排序) Create PROC P_viewPage             /*              nzperfect [no_mIss] 高效通用分页存储过程(双向检索) 2007.5.7  QQ:34813284              敬告:适用于单一主键或存在唯一值列的表或视图              ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围            

sql server快速删除整个数据库表和存储过程

情况:在远程数据库删除表执行太慢,表过多,数据库无权删除 结果:保留空数据库 方法:利用sql语句,查询网络文摘解决. 说明: 有些有约束,不能直接delete,需要先删除所有约束,语句: DECLARE c1 cursor for select 'alter table ['+ object_name(parent_obj) + '] drop constraint ['+name+']; ' from sysobjects where xtype = 'F' open c1 declare

SQL Server之游标的基础知识

什么是游标: 游标是可以在结果集中上下游动的指针. 游标的作用: --允许定位到结果集中的特定行. --从结果集的当前位置检索一行或多行数据. --支持对结果集中当前位置的行进行修改. 注意:游标虽然很好用,但是如果滥用游标的话,会对程序的性能造成很大影响,使用的时候一定要谨慎啊! 游标的种类: MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标. (1) Transact_SQL 游标 Transact_SQL 游标是由declare

SQL SERVER CURSOR游标的使用(转载)

一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合. 游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录. 二:游标的基本形式 声明游标:形式1DECLARE cursor_name [INSENSITIVE] [SCROLL] CURS

sql server 的游标

-- sql server 中的游标 --声明游标 /* declare cursorname [insensitive] [scroll] cursor for <select-查询块> [for {read only|update[of<列名>[,...,n]]}] Insensitive 表示把取出来的数据存入一个在tempdb库中创建的临时表,任何通过这个游标进行的操作,都会在这个临时表里进行.所有对基本表的改动都不会在用游标进行的操作中体现出来,不用该关键字,则用户对基本

一个SQL Server 2008 R2 死锁的问题解决

问题场景:在客户那碰到一个操作卡死的现象 问题解决: 1.如何挂钩是死锁问题:通过代码跟踪,发现是指执行一个SQL语句超时,因此猜想可能是表锁住了 2.如果确认是思索问题:通过SQL发现死锁,以下是相关的SQL select request_session_id SPID,OBJECT_NAME(resource_associated_entity_id) TABLENAME from sys.dm_tran_locks where resource_type='OBJECT' 上面这个SQL是

【转】微软MVP攻略 (如何成为MVP?一个SQL Server MVP的经验之谈)

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 初衷 什么是微软MVP? 成为微软MVP的条件? 如何成为微软MVP? (一) 申请时间划分 (二) 前期准备 (三) 下载/填写申请表格 (四) 申请MVP (五) 各种资料的填写 微软MVP奖项及权益包括什么? 成为微软MVP之后 个人建议 互动资讯 二.初衷 搞微软技术的,大家或多或少都有听说过微软的“最有价值专家”(MVP),网上也有不少资料对这个称谓做了介绍,但是都是一些大体的描述,并没有更加细节方面的,比