1

いくつかのフィールドにまたがるクラスター化されたインデックスがあります。これらのフィールドの1つはCustomerIDです。そのテーブルから読み取り、CustomerIDを更新するカーソルがあります。問題は、それが無限ループを引き起こすことです。customeridフィールドを変更すると、クラスター化されたインデックスが変更され、インデックス用にテーブルが再構築されると思います。この変更によりカーソルが無効になるため、FETCHNEXTFROMカーソルが最後に到達することはありません。

    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

カーソルが終了するまでテーブルがクラスター化インデックスのテーブルを更新しないようにするために発行できるコマンドはありますか?

4

2 に答える 2

3

これを書き直してカーソルを削除できない場合は、カーソルをSTATICとして宣言する必要があります。

DECLARE AccountSoftwareRegCursor CURSOR STATIC
FOR
SELECT...

DECLARE CURSORドキュメントから:

静的

カーソルが使用するデータの一時的なコピーを作成するカーソルを定義します。カーソルへのすべての要求は、tempdbのこの一時テーブルから応答されます。したがって、ベーステーブルに加えられた変更は、このカーソルに対して行われたフェッチによって返されるデータには反映されず、このカーソルは変更を許可しません。

于 2011-01-24T19:19:50.660 に答える
1

これをカーソルを使用する代わりにセットベースの操作に変更することに加えて、変更されている列を持つクラスター化インデックスは危険信号である必要があります。

Microsoftのクラスター化インデックス設計ガイドラインを確認してください

クラスター化されたインデックスは、一意で、狭く、静的で、増加し続ける必要があります

于 2011-01-24T20:01:31.463 に答える