聚簇索引从游标问题中更新

时间:2011-01-24 19:12:02

标签: sql-server cursor clustered-index

我有一个聚集在多个字段的索引。其中一个字段是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

是否有任何命令可以阻止表更新聚簇索引的表,直到游标结束?

2 个答案:

答案 0 :(得分:3)

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

DECLARE AccountSoftwareRegCursor CURSOR STATIC
FOR
SELECT...

来自DECLARE CURSOR文档:

  

STATIC

     

定义一个生成的游标   要使用的数据的临时副本   通过光标。所有要求   光标从这里回答   tempdb中的临时表;因此,   对基表进行的修改是   没有反映在返回的数据中   对此游标进行的提取,以及此操作   光标不允许修改。

答案 1 :(得分:1)

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

请查看Microsoft's Clustered Index Design Guidelines

聚集索引应为unique, narrow, static and ever-increasing