sqlserver 循环提升效率

--游标
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+100 WHERE 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+100 WHERE RowID = @RowID

    SELECT @RowID = MIN(RowID) FROM #Tmp WHERE DealFlg = 0
END
update O set O.CostValue=T.CostValue
from Orders O
    inner join #Tmp T on O.OrderID=T.OrderID

 

posted @ 2022-09-08 11:17  张岂逢  阅读(173)  评论(0)    收藏  举报