Sql server 从游标问题中更新聚集索引
我有一个包含多个字段的聚集索引。其中一个字段是CustomerID。我有一个从该表读取的游标,然后更新CustomerID。问题是它会导致无限循环。我假设当它更改customerid字段时,聚集索引被修改,并且表被重新构造为索引。此修改似乎使我的游标无效,因此从游标获取下一个游标永远不会到达终点Sql server 从游标问题中更新聚集索引,sql-server,cursor,clustered-index,Sql Server,Cursor,Clustered Index,我有一个包含多个字段的聚集索引。其中一个字段是CustomerID。我有一个从该表读取的游标,然后更新CustomerID。问题是它会导致无限循环。我假设当它更改customerid字段时,聚集索引被修改,并且表被重新构造为索引。此修改似乎使我的游标无效,因此从游标获取下一个游标永远不会到达终点 FETCH NEXT FROM AccountSoftwareRegCursor INTO @CurrentAccountSoftwareRegUId WHILE (@@FETCH_
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
在游标完成之前,我是否可以发出任何命令来阻止表更新聚集索引的表?如果无法重写此命令以消除游标,则需要将游标声明为静态
DECLARE AccountSoftwareRegCursor CURSOR STATIC
FOR
SELECT...
从文件中:
静止的
定义一个光标,使
要使用的数据的临时副本
通过光标。所有向
从这一点可以回答这些问题
tempdb中的临时表;因此
对基表所做的修改如下:
未反映在返回的数据中
获取对此游标所做的操作,以及
游标不允许修改
如果无法重写此项以消除光标,则需要将光标声明为静态
DECLARE AccountSoftwareRegCursor CURSOR STATIC
FOR
SELECT...
从文件中:
静止的
定义一个光标,使
要使用的数据的临时副本
通过光标。所有向
从这一点可以回答这些问题
tempdb中的临时表;因此
对基表所做的修改如下:
未反映在返回的数据中
获取对此游标所做的操作,以及
游标不允许修改
除了将其更改为基于集合的操作(而不是使用游标)之外,具有正在更改的列的聚集索引应该是一个红旗: 请复习
聚集索引应为除了将其更改为基于集合的操作而不是使用光标之外,具有正在更改的列的聚集索引应为红色标志: 请复习
聚集索引应该是您能告诉我们从光标填充到关闭的整个代码吗?;我的意思是,据我们所知,你可能会遗漏一些其他的语句,这些语句会使你的游标在一个无限的循环中运行,没有理由在游标中这样做。这应该是一个基于集合的操作。请阅读:对不起,我无法向您显示全部代码。我甚至不确定我的雇主政策是什么,因为我已经展示了。我已经实施了以下公认的答案作为绷带。我现在正在重写存储过程,不使用游标。你能给我们看一下整个代码吗,从游标的填充到你关闭它吗?;我的意思是,据我们所知,你可能会遗漏一些其他的语句,这些语句会使你的游标在一个无限的循环中运行,没有理由在游标中这样做。这应该是一个基于集合的操作。请阅读:对不起,我无法向您显示全部代码。我甚至不确定我的雇主政策是什么,因为我已经展示了。我已经实施了以下公认的答案作为绷带。我现在正在重写存储过程以不使用游标。虽然这确实从技术上解决了问题,但我建议查看Cade在下面关于在聚集索引中不包含CustomerID的建议。更新聚集索引也会级联到该表上的所有非聚集索引,这会增加操作完成所需的时间和死锁的可能性。虽然这确实从技术上解决了问题,但我建议查看Cade在下面关于不在聚集索引中包含CustomerID的建议。更新聚集索引也会级联到该表上的所有非聚集索引,这会增加操作完成所需的时间和死锁的可能性。