Обновление кластерного индекса из-за проблем с курсором - PullRequest
1 голос
/ 24 января 2011

У меня есть кластерный индекс по нескольким полям. Одним из этих полей является CustomerID. У меня есть курсор, который читает из этой таблицы, а затем обновляет CustomerID. Проблема в том, что это вызывает бесконечный цикл. Я предполагаю, что при изменении поля customerid кластеризованный индекс изменяется, и таблица реструктурируется для индекса. Кажется, эта модификация делает недействительным мой курсор, поэтому курсор FETCH NEXT FROM никогда не достигает конца.

    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

Можно ли выполнить какую-либо команду, чтобы таблица не обновляла таблицу для кластеризованного индекса до тех пор, пока курсор не завершит работу?

Ответы [ 2 ]

3 голосов
/ 24 января 2011

Если вы не можете переписать это, чтобы убрать курсор, вам нужно объявить ваш курсор как STATIC.

DECLARE AccountSoftwareRegCursor CURSOR STATIC
FOR
SELECT...

Из документации DECLARE CURSOR :

СТАТИЧЕСКИЕ

Определяет курсор, который делает временная копия данных, которые будут использоваться курсором. Все запросы к Курсор ответил от этого временная таблица в базе данных tempdb; следовательно, изменения, внесенные в базовые таблицы не отражено в данных, возвращаемых выборки, сделанные к этому курсору, и это курсор не допускает изменений.

1 голос
/ 24 января 2011

В дополнение к изменению этого в операцию на основе набора вместо использования курсора, ваш кластеризованный индекс, имеющий столбец, который изменяется, должен иметь красный флаг:

Пожалуйста, просмотрите Microsoft Clustered Index DesignРекомендации

Кластерный индекс должен быть уникальным, узким, статичным и постоянно увеличивающимся

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...