Я редко использую курсоры, но я только что обнаружил еще один предмет, который может укусить вас здесь - область действия имени курсора.
Если база данных CURSOR_DEFAULT является глобальной, вы получите ошибку «курсор уже существует», если вы объявите курсор в хранимой процедуре с определенным именем (например, «cur»), и пока этот курсор открыт, вывызовите другую хранимую процедуру, которая объявляет и открывает курсор с тем же именем (например, «cur»).Ошибка будет возникать во вложенной хранимой процедуре при попытке открыть «cur».
Запустите этот бит sql, чтобы увидеть ваш CURSOR_DEFAULT:
select is_local_cursor_default from sys.databases where name = '[your database name]'
Если это значение равно «0»тогда то, как вы называете свой вложенный курсор, имеет значение!