Основная проблема заключается в изменении индекса строк на 1,2,3 .. где контакт-идентификатор и тип одинаковы. но все столбцы могут содержать точно такие же данные из-за того, что какой-то бывший сотрудник перепутал и обновил все строки с помощью идентификатора контакта и типа. так или иначе есть строки, которые не запутаны, но строки индекса одинаковы. Это полный хаос.Курсор внутри курсора
Я попытался использовать внутренний курсор с переменными, исходящими из внешнего курсора. Но кажется, что он застрял во внутреннем курсоре.
Часть запроса выглядит следующим образом:
Fetch NEXT FROM OUTER_CURSOR INTO @CONTACT_ID, @TYPE
While (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
DECLARE INNER_CURSOR Cursor
FOR
SELECT * FROM CONTACTS
where CONTACT_ID = @CONTACT_ID
and TYPE = @TYPE
Open INNER_CURSOR
Fetch NEXT FROM INNER_CURSOR
While (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
Что может быть проблема? Является ли @@ FETCH_STATUS двусмысленным или что-то еще?
EDIT: все выглядит нормально, если я не использую этот код внутри внутреннего курсора:
UPDATE CONTACTS
SET INDEX_NO = @COUNTER
where current of INNER_CURSOR
EDIT: здесь большая картина:
BEGIN TRAN
DECLARE @CONTACT_ID VARCHAR(15)
DECLARE @TYPE VARCHAR(15)
DECLARE @INDEX_NO SMALLINT
DECLARE @COUNTER SMALLINT
DECLARE @FETCH_STATUS INT
DECLARE OUTER_CURSOR CURSOR
FOR
SELECT CONTACT_ID, TYPE, INDEX_NO FROM CONTACTS
WHERE
CONTACT_ID IN (SELECT CONTACT_ID FROM dbo.CONTACTS
WHERE CONTACT_ID IN(...)
GROUP BY CONTACT_ID, TYPE, INDEX_NO
HAVING COUNT(*) > 1
OPEN OUTER_CURSOR
FETCH NEXT FROM OUTER_CURSOR INTO @CONTACT_ID, @TYPE, @INDEX_NO
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
SET @COUNTER = 1
DECLARE INNER_CURSOR CURSOR
FOR
SELECT * FROM CONTACTS
WHERE CONTACT_ID = @CONTACT_ID
AND TYPE = @TYPE
FOR UPDATE
OPEN INNER_CURSOR
FETCH NEXT FROM INNER_CURSOR
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
UPDATE CONTACTS
SET INDEX_NO = @COUNTER
WHERE CURRENT OF INNER_CURSOR
SET @COUNTER = @COUNTER + 1
FETCH NEXT FROM INNER_CURSOR
END
CLOSE INNER_CURSOR
DEALLOCATE INNER_CURSOR
FETCH NEXT FROM OUTER_CURSOR INTO @CONTACT_ID, @TYPE, @INDEX_NO
END
CLOSE OUTER_CURSOR
DEALLOCATE OUTER_CURSOR
COMMIT TRAN
Еще один вопрос: какая версия SQL-сервера, потому что это определит, что мы можем использовать для создания номеров строк, чтобы заменить ваш @counter во внутреннем курсоре. –
Знаете ли вы, что логика основана на множестве? Курсоры должны использоваться в качестве последнего средства ... –
Итак, можете ли вы быть достаточно любезны, чтобы предложить ответ? если вам нужна дополнительная информация о ситуации, я с удовольствием предоставляю ее. –