首页 > 技术文章 > sql游标及模仿游标操作

zhuyapeng 2016-09-08 16:12 原文

游标用途:对一个查询出来的结果,每一行作为参数进行操作

一:游标操作

--申请一个游标
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

 

推荐阅读