mssql数据库游标批量修改符合条件的记录

简介: //需求:由于项目刚上传,没有票数,为了表现出一定的人气,需要在一开始把各项目的票数赋一个值 , 但每个项目不能一样,否则容易看出问题,呵呵 。 DECLARE @Id varchar(50) DECLARE My_Cursor CURSOR --定义游标FOR (SELECT Id FROM dbo.

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

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


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
*/





相关文章
|
7月前
|
数据库
数据库数据恢复—MSSQL报错“附加数据库错误823”的数据恢复案例
MSSQL Server数据库比较常见的报错是“附加数据库错误823”。如果数据库有备份,只需要还原备份即可;如果无备份或者备份不可用,则需要使用专业的数据恢复手段去恢复数据。 MSSQL Server数据库出现“823”的报错信息通常情况下有以下三种可能:1、由于数据库的物理页面出现了损坏。2、校验值被损坏导致的数据库页面无法被识别。3、异常断电、文件系统损坏导致的数据库页面丢失。
数据库数据恢复—MSSQL报错“附加数据库错误823”的数据恢复案例
|
9月前
|
存储 Oracle 关系型数据库
MSSQL之六 数据库设计
MSSQL之六 数据库设计
77 0
|
29天前
|
存储 SQL 数据库
数据库sql语句-----游标和存储过程
数据库sql语句-----游标和存储过程
22 1
|
6天前
|
存储 关系型数据库 MySQL
MySQL数据库——存储过程-游标(介绍-声明游标、打开游标、获取游标记录、关闭游标,案例)
MySQL数据库——存储过程-游标(介绍-声明游标、打开游标、获取游标记录、关闭游标,案例)
11 0
|
29天前
|
SQL 存储 关系型数据库
数据库迁移mssql to pgsql之函数转换
数据库迁移mssql to pgsql之函数转换
|
29天前
|
XML SQL 安全
某教程学习笔记(一):08、MSSQL数据库漏洞
某教程学习笔记(一):08、MSSQL数据库漏洞
25 0
|
29天前
|
存储 SQL 安全
MSSQL存储过程:数据库操作的得力助手
MSSQL存储过程:数据库操作的得力助手
44 0
|
29天前
|
存储 SQL 定位技术
数据库基础(六):T-SQL语言程序设计、游标定义与使用及存储过程创建与信息查找
数据库基础(六):T-SQL语言程序设计、游标定义与使用及存储过程创建与信息查找
|
29天前
|
存储 定位技术 数据库
开启数据库性能之旅:MSSQL存储过程索引优化深度解析
开启数据库性能之旅:MSSQL存储过程索引优化深度解析
|
6月前
|
存储 关系型数据库 MySQL
Mysql数据库 12.SQL语言 储存过程 下 储存过程管理和游标
Mysql数据库 12.SQL语言 储存过程 下 储存过程管理和游标
43 1