详细demo教你sqlserver利用存储过程循环(游标)处理数据

以下代码的应用场景为:
找出所有指定等级且积分不足的用户,充值到指定金额,并给累计积分的字段加上充值的数值;
学会基本用法后,大部分场景都可套入参考使用

USE [数据库名]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[proc_addvoucherforvip]
AS
BEGIN
	SET NOCOUNT ON;

    -- 利用游标循环更新会员表中的数据
	DECLARE @voucher INT;--用于临时存储当前会员的积分
	DECLARE @mID INT;--用于临时存储当前会员的id
	DECLARE @addVoucher INT --用于临时存储当前会员的积分的增加量
	DECLARE @index INT = 1--循环时用于标记已修改会员数量
	DECLARE @count INT --用于标记会员总数
	select @count = COUNT(id) from dbo.member where (usertype = 1 or usertype = 2) and status = 1 and voucher <3000  --查询所有符合条件的会员

	DECLARE My_Cursor CURSOR --定义游标
	FOR (SELECT id,voucher FROM dbo.member where (usertype = 1 or usertype = 2) and status = 1 and voucher <3000) --查出需要的集合放到游标中
	OPEN My_Cursor; --打开游标
	FETCH NEXT FROM My_Cursor INTO @mID,@voucher; --读取第一行数据

	--开始循环
	WHILE @@FETCH_STATUS = 0
	BEGIN
		--打印方便观察脚本执行情况
		print '正在修改第'+convert(varchar,@index)+'条数据'+convert(varchar,@mID)+',共'+convert(varchar,@count)
		print '会员ID为:'+convert(varchar,@mID)
		BEGIN
			set @addVoucher = 3000-@voucher --充值的金额
			exec('update member set voucher =3000,totalAdd += '+@addVoucher+' where id ='+@mID) --给当前用户充值,并给累加字段加上充值的金额
		END
		FETCH NEXT FROM My_Cursor INTO @mID,@voucher;--读取下一行数据,并把值重新赋值给变量
		set @index+=1
	END

	--循环结束
	CLOSE My_Cursor; --关闭游标
	DEALLOCATE My_Cursor; --释放游标
END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值