0

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

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

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

这是我的代码

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 秒内执行此查询。

提前致谢

4

1 回答 1

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子句,因此无论如何它都是伪随机的。

于 2012-10-26T05:32:24.577 回答