Удалить строку из исходного курсора SQL Server - PullRequest
2 голосов
/ 05 октября 2011

У меня есть курсор SQL Server 2005, работающий над табличной переменной с именем @workingSet.

Иногда строки могут быть связаны, и в этом случае я обрабатываю выбранную строку и связанные строки одновременно. Затем я удаляю связанные записи из @workingset, поскольку мне не нужно обрабатывать их в цикле.

В @workingSet с 7 строками первые две связаны, поэтому, когда я обрабатываю 1, я также обрабатываю 2. Я удаляю строку 2 из источника курсора (@workingSet) и затем выбираю следующую. Проблема в том, что он возвращает вторую строку в @workingset (ту, которую я удалил на предыдущей итерации).

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

Любая помощь с благодарностью.

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Ответ, по-видимому, заключается в том, что табличная переменная, которая используется в качестве источника курсора, должна иметь первичный ключ. Я добавил это, и все работает правильно.

0 голосов
/ 05 октября 2011

Не очень хорошо знаком с курсорами, но после быстрого теста вам нужно избегать объявления курсора с помощью параметров STATIC или KEYSET, тогда изменения в базовой таблице отражаются в курсоре.

SET NOCOUNT ON;

DECLARE @WorkingTable TABLE(C int)

INSERT INTO @WorkingTable VALUES (1),(2),(3)

DECLARE @C int

DECLARE wt_cursor CURSOR 
DYNAMIC /*Or left blank but not STATIC or KEYSET*/
FOR 
SELECT C
FROM @WorkingTable

OPEN wt_cursor;

FETCH NEXT FROM wt_cursor 
INTO @C

DELETE FROM @WorkingTable

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @C;


    FETCH NEXT FROM wt_cursor 
    INTO @C;
END
CLOSE wt_cursor;
DEALLOCATE wt_cursor;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...