Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从游标问题中更新聚集索引_Sql Server_Cursor_Clustered Index - Fatal编程技术网

Sql server 从游标问题中更新聚集索引

Sql server 从游标问题中更新聚集索引,sql-server,cursor,clustered-index,Sql Server,Cursor,Clustered Index,我有一个包含多个字段的聚集索引。其中一个字段是CustomerID。我有一个从该表读取的游标,然后更新CustomerID。问题是它会导致无限循环。我假设当它更改customerid字段时,聚集索引被修改,并且表被重新构造为索引。此修改似乎使我的游标无效,因此从游标获取下一个游标永远不会到达终点 FETCH NEXT FROM AccountSoftwareRegCursor INTO @CurrentAccountSoftwareRegUId WHILE (@@FETCH_

我有一个包含多个字段的聚集索引。其中一个字段是CustomerID。我有一个从该表读取的游标,然后更新CustomerID。问题是它会导致无限循环。我假设当它更改customerid字段时,聚集索引被修改,并且表被重新构造为索引。此修改似乎使我的游标无效,因此从游标获取下一个游标永远不会到达终点

    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的建议。更新聚集索引也会级联到该表上的所有非聚集索引,这会增加操作完成所需的时间和死锁的可能性。