老杂毛博客
  青青子衿,悠悠我心。但为君故,沉吟至今。
博客首页 | 人生历程 | 编程开发 | 机关门  
  文章分类
 
博客首页 > 软件网络编程 > 文章正文

sql利用游标循环,遍历表循环结果集

2012/8/15 15:36:37
 

说明

        我们经常需要对一个表进行处理的时候数据来源于另一个表,如果用程序来实现当然非常方便,但是麻烦的是我们经常需要让这样的程序定期执行,因为一个小功能我们不可能开发一个服务出来让系统每天定期执行,这远远增加了维护成本,所以干脆就用存储过程来实现,建立sql作业每天定期执行好了。

        很多人不赞成用游标,说游标效率慢,但是如果几千条数据我们需要循环处理的时候用游标还是很方便的,即便是慢,肯定也要比用程序处理要迅速一些。

需求

        有渠道表channel,有统计表stat,每天在凌晨将用户汇总到表groupuser表中以方便查询。

代码如下:

Create procedure [Store_Stat_GroupUser]
--编写人:老杂毛
as
begin
declare @fl_field nvarchar(36) 
declare @id int
declare @newcount int -- 新用户数
declare @oldcount int -- 老用户数
declare @allcount int -- 总用户数

-- 定义游标
declare Temp_Table cursor for
        select tid,cid from channel -- 查询结果

    -- 打开游标 取第一行记录 赋给@fl_field
    open Temp_Table
    fetch next from Temp_Table into @id, @fl_field

    -- 循环开始
    while @@fetch_status = 0
    begin
        set @allcount=(select COUNT(storeuserid) as allcoun from storeuser where datediff(day,adddate,GETDATE())=0 and cid=@id)
        set @oldcount=(select count(imei) from storeuser where datediff(day,adddate,GETDATE())#gt;0 and imei in (select imei from storeuser where datediff(day,adddate,GETDATE())=0 and cid=@id) and cid=@id)

        set @newcount=@allcount-@oldcount --得到新用户数
        insert into groupusercount(cid,groupdate,oldusercount,newusercount,allusercount) values(@id,GETDATE(),@oldcount,@newcount,@allcount)
        -- 取下一条记录
        fetch next from Temp_Table into @id, @fl_field
    end
    -- 循环结束

    -- 关闭游标 删除游标引用
    close Temp_Table
    deallocate Temp_Table


本例非常简单,只是用游标实现了一个循环,遍历渠道表结果集,分别为每一个渠道做统计,然后把汇总后的新数据插入到汇总表:

 insert into groupusercount(cid,groupdate,oldusercount,newusercount,allusercount) values(@id,GETDATE(),@oldcount,@newcount,@allcount)

如此我们就用游标完成了一个简单的汇总功能,保存成存储过程以后建立sql作业定期执行就OK了。

本文就写到这里,如果有哪位朋友有效率更高的办法请留言告知(老杂毛/文)

阅读: (2209)  评论(16)  
 
网友评论:
 
 1.2016/8/8 5:56:26 
 2.2016/8/19 13:48:19 
 3.yzc6662016/10/7 9:50:10 
博主的文章写得极度棒 很喜欢
 4.2016/11/17 4:42:11 
 5.2017/1/6 7:20:16 
 6.2017/4/2 13:07:41 
 7.2018/1/8 18:42:42 
 8.2018/1/24 1:19:28 
 
相关文章:
 微信支付asp.net V3.3.7 sys
 ERRORLOG 文件太大的处理办法
 Attempted to read or w
 Ctrl键自动按下,Ctrl键和Alt总感觉
 解决 Your project contai
 adb install 多设备id号一样,如
 如何去掉优酷,土豆等网站的广告?
 webview的loadData方法加载乱码
 让iis7支持apk文件下载
 sql利用游标循环,遍历表循环结果集
 
 
     
联系作者: QQ: 657603425 Email: 657603425@qq.com
Copyright © 2007-2014 www.laozamao.com All Rights Reserved
京ICP备09002242号 北京海淀分局备案号:1101084842