zoukankan      html  css  js  c++  java
  • mssql数据库游标批量改动符合条件的记录

    //需求:因为项目刚上传,没有票数,为了表现出一定的人气,须要在一開始把各项目的票数赋一个值 ,

    但每一个项目不能一样,否则easy看出问题,呵呵 。


    DECLARE @Id varchar(50) 
    DECLARE My_Cursor CURSOR --定义游标
    FOR (SELECT Id FROM dbo.kinpanAwardProject where session=9) --查出须要的集合放到游标中
    OPEN My_Cursor; --打开游标
    FETCH NEXT FROM My_Cursor INTO @Id; --读取第一行数据(将Id放到@Id变量中)
    WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT @Id; --打印数据(Id)
            UPDATE dbo.kinpanAwardProject SET ProTicketCount = cast( floor(rand()*30) as int)+40 WHERE Id = @Id; --更新数据,使用随机数。
            FETCH NEXT FROM My_Cursor INTO @Id; --读取下一行数据(将查询的Id放到@Id变量中)
        END
    CLOSE My_Cursor; --关闭游标
    DEALLOCATE My_Cursor; --释放游标
    GO
    


    另一种使用方法,可能更加好,我觉得,假设不须要对id进行推断的话,在改动时就不须要where查询,直接改动游标当前位置会更快。

    来自:http://www.cnblogs.com/zengen/archive/2011/08/10/2133423.html

    DECLARE My_Cursor CURSOR --定义游标
    FOR (SELECT * FROM dbo.MemberAccount) --查出须要的集合放到游标中
    OPEN My_Cursor; --打开游标
    FETCH NEXT FROM My_Cursor ; --读取第一行数据
    WHILE @@FETCH_STATUS = 0
        BEGIN
            --UPDATE dbo.MemberAccount SET UserName = UserName + 'A' WHERE CURRENT OF My_Cursor; --更新
            --DELETE FROM dbo.MemberAccount WHERE CURRENT OF My_Cursor; --删除
            FETCH NEXT FROM My_Cursor; --读取下一行数据
        END
    CLOSE My_Cursor; --关闭游标
    DEALLOCATE My_Cursor; --释放游标
    GO
    



    3、查询多个字段值的方法




    DECLARE @Id varchar(50)
    declare @dtime datetime
    DECLARE My_Cursor CURSOR --定义游标
    FOR (SELECT Id,UpdateTime FROM dbo.PropertyPro) --查出须要的集合放到游标中
    OPEN My_Cursor; --打开游标
    FETCH NEXT FROM My_Cursor INTO @Id,@dtime; --读取第一行数据(将Id放到@Id变量中,UpdateTime值放到@dtime中)
    WHILE @@FETCH_STATUS = 0
        BEGIN
            --select @dtime= UpdateTime from PropertyPro where id=@id;
            PRINT @Id+'  '+cast(@dtime as varchar(30)); --打印数据(Id)
            update PropertyProFile set UpdateTime=@dtime where proid=@id and UpdateTime is not null;
            --UPDATE dbo.kinpanAwardProject SET ProTicketCount = cast( floor(rand()*20) as int)+70 WHERE Id = @Id; --更新数据
            FETCH NEXT FROM My_Cursor INTO @Id,@dtime; --读取下一行数据(将查询的Id放到@Id变量中)
        END
    CLOSE My_Cursor; --关闭游标
    DEALLOCATE My_Cursor; --释放游标
    GO


    条件推断再操作:


    DECLARE @Id varchar(50)
    --declare @votecount int
    declare @votesum int
    declare @voteid varchar(100)

    DECLARE My_Cursor CURSOR --定义游标
    FOR (SELECT distinct pp.Id FROM dbo.PropertyPro pp,PropertyCategory pc where  pc.id=pp.classid and (pc.parentid=2 or pc.parentid=3 or pc.parentid=4)) --查出须要的集合放到游标中
    OPEN My_Cursor; --打开游标
    FETCH NEXT FROM My_Cursor INTO @Id; --读取第一行数据(将Id放到@Id变量中)
    WHILE @@FETCH_STATUS = 0
        BEGIN
            PRINT @Id; --打印数据(Id)
            set @voteid=replace(replace(replace(replace( CONVERT(varchar(100), GETDATE(), 121),'-',''),' ',''),':',''),'.','')+left(replace(newid(),'-',''),10)
            --select  @votecount=count(1) from UserVote where AwardProID=@Id
            select @votesum=sum(tickets) from UserVote where AwardProID=@Id  --查询总赞数
            
            if @votesum is null
            begin
             set @votesum=0
            end
            if @votesum<1200  --总赞数小于1200,才删除再初始化赞数
            begin
                delete from UserVote where AwardProID=@Id
                insert into dbo.UserVote(id,userid,awardproid,votedatetime,tickets)values(@voteid,'1',@Id,getdate(),cast(floor(rand()*1800) as int)+1200+@votesum)
            end
            
           -- UPDATE dbo.kinpanAwardProject SET ProTicketCount = cast( floor(rand()*20) as int)+70 WHERE Id = @Id; --更新数据
            FETCH NEXT FROM My_Cursor INTO @Id; --读取下一行数据(将查询的Id放到@Id变量中)
        END
    CLOSE My_Cursor; --关闭游标
    DEALLOCATE My_Cursor; --释放游标
    GO
    /*
    select top 1000  * from uservote order by votedatetime desc
    */





  • 相关阅读:
    论.Net 2.0消失的虚拟内存空间
    检查IE版本的方法
    升级.Net 4.0遇到的两个问题
    关于ID生成算法
    探秘.Net 4.0的StringBuilder实现
    关于填充DataTable的效率问题
    [已解决]请教:时间格式“2008109公元 10:43:27,AM”,这种时间格式是该怎么恢复默认设置
    请教:c#中的窗体怎么才能像c++的那窗体一样按键后可以调出输入法?
    在access中执行SQL,SQL中包含IIF,取出来的结果集字符串被截断了,请教各位大侠,这个是为什么呀?谢谢!
    请教:PL/SQL中执行to_date(to_char(a.lastupdatedate, 'YYYYMMDD HH24:MI:SS'),'YYYYMMDD HH24:MI:SS') ,上午12点整为什么格式化出来没有时分秒?
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3910005.html
Copyright © 2011-2022 走看看