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

时间:2023-01-21 06:00:36

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

但每一个项目不能一样,否则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

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

另一种使用方法,可能更加好,我觉得,假设不须要对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

*/