使用游标更新

时间:2012-10-26 05:18:26

标签: sql-server

希望你一切都好。我在sql server查询中有一些问题。

我想在一个有534,000行的表中更新记录。如果我创建一个while循环来更新所有记录,那么它需要时间。

然后我应该为更新记录创建一个游标。在此之后,我使用Fetch创建一个用于更新的游标。这个游标在10,000行中快速完成更新过程,但是当我使用具有超过30,000行的表时,需要5分钟来执行Query。我不知道是什么问题。

我的代码

DECLARE @RNo INT --Declaring the Variable @id
DECLARE @id INT --Declaring the Variable @id
set @RNo=1

DECLARE @MyCursor CURSOR -- Declaring the Cursor
SET @MyCursor = CURSOR --Assigning the cursor
FOR
SELECT Col1 FROM MyTable  --Query related to Cursor
for update of Col2

OPEN @MyCursor -- Opening the Created cursor
FETCH NEXT FROM @MyCursor --Retrieving the record one by one
INTO @id --Assigning the value in declared Variable
    WHILE @@FETCH_STATUS = 0 
    BEGIN

        update MyTable
        set Col2=@RNo
         where current of @MyCursor

        set @RNo=@rno+1
        print @id
FETCH NEXT
    FROM @MyCursor INTO @id
END
CLOSE @MyCursor -- Closing the Cursor
DEALLOCATE @MyCursor -- Deallocating the Cursor Memory

注意:我的查询使用正确的数据执行,但问题是需要5分钟我只想在10秒内执行此查询。

先谢谢

1 个答案:

答案 0 :(得分:3)

SQL Server专家曾告诉我,如果你需要使用游标,请务必确保使用LOCAL STATIC游标。除此之外,此查询将一次更新您的数据。

;WITH TMP AS (
  SELECT *, ROW_NUMBER() OVER (ORDER BY Col1) RN
  FROM MyTable
)
UPDATE TMP SET Col2 = RN;

我已经任意选择根据ORDER BY Col1生成行号,您可以调整它。你的光标没有ORDER BY子句,所以无论如何它都是伪随机的。