SQLServer中用While循环替代游标(Cursor)的解决方案

更新时间:2023-07-01 23:12:31 阅读: 评论:0

SQLServer中⽤While循环替代游标(Cursor)的解决⽅案By⾏处理数据,推荐2种⽅式:
1、游标
2、While循环羊奶粉品牌排行榜
我们来了解下这两种⽅案处理1w⾏数据分别需要多长时间。
⼀、游标。
⾸先我们填充⼀个表,⽤优雅的递归⽅式填充。
create table Orders(OrderID int,CostValue decimal(18,2) )
;with cte_temp
as
(
lect1as OrderID荷兰黄瓜
静态网站
union all
lect OrderID+1from cte_temp where OrderID<10000
)
三年级上册第五单元作文
inrt into Orders(OrderID)
lect OrderID from cte_temp option (maxrecursion 32767);
现在我们的订单表Orders有了⼀万条订单,但是CostValue还是NULL值。
我们⽤游标的⽅式给每⼀条订单添加⼀个CostValue,耗时44s。
--游标
DECLARE@OrderID int
DECLARE cursor_CostValue CURSOR FOR SELECT OrderID FROM Orders
OPEN cursor_CostValue
FETCH NEXT FROM cursor_CostValue INTO@OrderID
WHILE@@FETCH_STATUS=0
BEGIN
UPDATE Orders SET CostValue = OrderID+100WHERE OrderID =@OrderID
FETCH NEXT FROM cursor_CostValue INTO@OrderID
END
CLOSE cursor_CostValue
DEALLOCATE cursor_CostValue
⼆、While循环
将数据放在临时表中,然后操作临时表,最后更新回总表。耗时16s。
DECLARE@RowID int
-
-    获取待处理的数据记录到临时表
--    字段说明:RowID:记录⾏号 / DealFlg:⾏处理标识
SELECT  RowID =IDENTITY(INT , 1, 1),DealFlg=0,OrderID,CostValue =0
INTO #Tmp
FROM Orders
上环好不好
SELECT@RowID=MIN(RowID) FROM #Tmp WHERE DealFlg =0
--    若最⼩⾏号不为空(有需要处理的数据)
WHILE@RowID IS NOT NULL
BEGIN
UPDATE #Tmp SET DealFlg =1,CostValue=OrderID+100WHERE RowID =@RowID
SELECT@RowID=MIN(RowID) FROM #Tmp WHERE DealFlg =0
END
update O t O.CostValue=T.CostValue
from Orders O
inner join #Tmp T on O.OrderID=T.OrderID
英语励志名言短句还有⼀种错误的While循环,即不把数据放在临时表中,直接操作本表,会⼤⼤增加耗时。
因为多次调⽤本表,如果在⽣产环境,将是⼀个灾难。
拆迁计划
DECLARE@OrderID INT
--表中OrderID最⼩的值
SELECT@OrderID=MIN(OrderID) FROM Orders where CostValue is null
WHILE@OrderID IS NOT NULL
BEGIN
小星星吉他简谱UPDATE Orders SET CostValue = OrderID+100WHERE OrderID =@OrderID SELECT@OrderID=MIN(OrderID) FROM Orders where CostValue is null END

本文发布于:2023-07-01 23:12:31,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1073046.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   表中   处理   耗时
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图