我有一个聚集在多个字段的索引。其中一个字段是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
是否有任何命令可以阻止表更新聚簇索引的表,直到游标结束?
答案 0 :(得分:3)
如果你不能重写它来消除光标,你需要将光标声明为STATIC。
DECLARE AccountSoftwareRegCursor CURSOR STATIC
FOR
SELECT...
来自DECLARE CURSOR文档:
STATIC
定义一个生成的游标 要使用的数据的临时副本 通过光标。所有要求 光标从这里回答 tempdb中的临时表;因此, 对基表进行的修改是 没有反映在返回的数据中 对此游标进行的提取,以及此操作 光标不允许修改。
答案 1 :(得分:1)
除了将其更改为基于集合的操作而不是使用游标之外,具有正在更改的列的聚簇索引应该是一个红色标记: