游标用途:对一个查询出来的结果,每一行作为参数进行操作
一:游标操作
--申请一个游标 DECLARE MyCursor CURSOR FOR SELECT ID FROM dbo.tb_stock WHERE virtual_stock=0 --打开游标 OPEN MyCursor --移动游标接收里面的值 DECLARE @id INT FETCH NEXT FROM MyCursor INTO @id --@@FETCH_STATUS全局变量判断游标的状态 0:读取完成 -1:读取失败 -2:记录被删除 WHILE @@FETCH_STATUS=0 BEGIN --对得到数据进行操作 UPDATE dbo.tb_stock SET virtual_stock=10 WHERE ID=@id --移动游标 -- FETCH格式上除了NEXT还有PRIOR、FRIST、LAST。分别是上一行、第一行及最后一行。 FETCH NEXT FROM MyCursor INTO @id END
--关闭游标
CLOSE MyCursor
--释放资源
DEALLOCATE MyCursor
二:用while循环操作
go --数据分组放入临时表 DECLARE @Count INT ,@id INT --定义临时表接收数据 CREATE TABLE #tempTable(id INT NOT NULL) --将原有数据加行row,顺序排序 INSERT INTO #tempTable SELECT t.id FROM (SELECT ROW_NUMBER() OVER(ORDER BY goods_id DESC)id,goods_id , SUM(quantity) number FROM dbo.tb_stock GROUP BY goods_id ) as t --计算总计条数 SET @Count=(SELECT COUNT(1) FROM #tempTable) --循环读取每一条数据 WHILE @Count>0 BEGIN --得到每一条数据进行处理 SET @id=(SELECT * FROM #tempTable WHERE id=@Count) UPDATE dbo.tb_stock SET virtual_stock=15 WHERE ID=@id --移动到下一条数据 SET @Count=@Count-1 END