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