1

我有一个跨越多个字段的聚集索引。这些字段之一是 CustomerID。我有一个从该表中读取的游标,然后更新 CustomerID。问题是它会导致无限循环。我假设当它更改 customerid 字段时,会修改聚集索引并为索引重新构建表。此修改似乎使我的光标无效,因此 FETCH NEXT FROM Cursor 永远不会到达末尾。

    FETCH NEXT FROM AccountSoftwareRegCursor 
INTO @CurrentAccountSoftwareRegUId

    WHILE (@@FETCH_STATUS = 0)
    BEGIN

    UPDATE 
        Licensing.AccountSoftwareRegistration 
    SET 
        AccountUid = @ToAccountUid, 
        CompanyId = @ToCompanyId, 
        UpdatedBy = isnull(@UpdatedBy,'Asset Transfer'),
        UpdatedByAccount = @UpdatedByAccount,
        UpdatedOn = GETUTCDATE()
    WHERE 
        AccountSoftwareRegUid = @CurrentAccountSoftwareRegUId

我可以发出任何命令来阻止表更新聚集索引的表,直到光标完成?

4

2 回答 2

3

如果你不能重写它来消除游标,你需要将你的游标声明为 STATIC。

DECLARE AccountSoftwareRegCursor CURSOR STATIC
FOR
SELECT...

DECLARE CURSOR文档中:

静止的

定义一个游标,该游标制作数据的临时副本以供游标使用。对游标的所有请求都是从 tempdb 中的这个临时表中回答的;因此,对基表所做的修改不会反映在对该游标进行的提取返回的数据中,并且该游标不允许修改。

于 2011-01-24T19:19:50.660 回答
1

除了将其更改为基于集合的操作而不是使用游标之外,具有正在更改的列的聚集索引应该是一个危险信号:

请查看Microsoft 的聚集索引设计指南

聚集索引应该是唯一的、窄的、静态的和不断增长的

于 2011-01-24T20:01:31.463 回答