2011-01-24 49 views
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 

是否有任何命令我可以發出停止表更新表的聚集索引,直到光標完成後?

+1

你能向我們展示從光標的總體到你關閉它的整個代碼嗎?我的意思是,就我們所知,你可能會錯過一些使你的光標處於無限循環的其他語句 – Lamak 2011-01-24 19:19:20

+1

在遊標中這樣做沒有任何理由。這應該是一個基於集合的操作。請閱讀:http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM 2011-01-24 19:44:50

回答

3

如果你不能重寫這個來消除遊標,你會希望將你的遊標聲明爲STATIC。

DECLARE AccountSoftwareRegCursor CURSOR STATIC 
FOR 
SELECT... 

DECLARE CURSOR文檔:

STATIC

定義一個遊標,以由光標被用於 的數據的 臨時副本。所有對 光標的請求都將從tempdb中的此臨時表中回答。因此, 對基表進行的修改是 不反映在由 返回的數據中,並且此光標不允許修改。