Member 12612576 Ответов: 1

Превышен максимальный уровень вложенности хранимых процедур (предел 32)


Я пытаюсь удалить несколько дубликатов с помощью sp и курсора, но он выдает ошибку

Что я уже пробовал:

creat proc uspfixdup
(
  @paramID int
)
as


declare @id int
declare _cursor CURSOR LOCAL FAST_FORWARD FOR
select  id
from departments dp
where dp.roleid=1
group by id
having count(*)>1
order by id desc

open _cursor

fetch next FROM _cursor INTO @id

while @@FETCH_STATUS = 0
BEGIN
print @id

 exec uspfixdup @paramID = @id


fetch next FROM _cursor INTO @id

END

close _cursor
DEALLOCATE _cursor


DECLARE @deptID1 int
DECLARE @deptID2 int

SELECT @deptID1 = deptID
FROM   departments 
WHERE  ID = @paramID
AND    RoleID = 1


SELECT deptID2 = deptID
FROM   departments 
WHERE  ID = @paramID
AND    RoleID = 1
AND    deptID <> @deptID1


IF @deptid1 >1 AND @deptID2>1
BEGIN

  IF @depti1 < @deptID2
    DELETE FROM departments  WHERE deptID = @detID1
  ELSE
    DELETE FROM departments  WHERE deptID = @deptID2
END
ELSE
  PRINT 'no duplicate '
GO

Suvendu Shekhar Giri

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

ZurdoDev

Ошибка должна быть довольно ясной. Ваш sp вызывает себя снова и снова рекурсивно, а sql допускает только 32 вызова таким образом.

Member 12612576

Спасибо я уже все исправил

1 Ответов

Рейтинг:
0

ZurdoDev

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

Хотя рад видеть, что у тебя все получилось.