Конфликт имени курсора хранимой процедуры на сервере SQL - PullRequest
3 голосов
/ 19 августа 2010

У меня есть ситуация, когда одна хранимая процедура SQL Server вызывает другую, и обе они используют курсоры с одинаковыми именами. Это вызывает конфликт, поскольку у курсоров видимость не ограничена хранимой процедурой, в которой они объявлены.

Есть ли способ сделать курсоры приватными для процедуры, в которой они были объявлены?

Ответы [ 6 ]

7 голосов
/ 19 августа 2010

Используйте опцию LOCAL, когда объявляет курсор .

LOCAL

Указывает, что область курсора является локальной дляпакет, хранимая процедура или триггер, в котором был создан курсор.Имя курсора действует только в этой области.На курсор можно ссылаться с помощью локальных переменных курсора в пакете, хранимой процедуре или триггере или параметра OUTPUT хранимой процедуры.Параметр OUTPUT используется для передачи локального курсора обратно в вызывающий пакет, хранимую процедуру или триггер, который может назначить параметр переменной курсора для ссылки на курсор после завершения хранимой процедуры.Курсор неявно освобождается при завершении пакета, хранимой процедуры или триггера, если только курсор не был передан обратно в параметре OUTPUT.Если он передается обратно в параметре OUTPUT, курсор освобождается, когда последняя переменная, ссылающаяся на него, освобождается или выходит из области видимости.

4 голосов
/ 19 августа 2010

Видимо есть локальное ключевое слово.

http://www.codeguru.com/cpp/data/mfc_database/sqlserver/article.php/c7177

3 голосов
/ 19 августа 2010

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

ОБЪЯВИТЬ КУРСОР МЕСТНЫЙ

2 голосов
/ 19 августа 2010

Являются ли курсоры local курсорами или global курсорами? ... Сделать их local или просто изменить имя одного из курсоров и покончить с этим

0 голосов
/ 29 января 2018

По умолчанию, если переключатель LOCAL / GLOBAL не указан при объявлении курсора, он будет неявно установлен на LOCAL. Однако я предлагаю определить LOCAL для ясности других людей при чтении вашего кода.

Пожалуйста, обратитесь к следующей заметке статьи:

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql

Если вы пишете два курсора в одной и той же области видимости (одна и та же хранимая процедура), просто назовите их разными именами.

0 голосов
/ 10 ноября 2016

Если вам конкретно не нужен глобальный курсор, используйте локальный курсор.

Если ваше объявление курсора не включает ключевое слово LOCAL или GLOBAL, тогда SQL Server будет использовать конфигурацию сервера по умолчанию. Вы можете определить конфигурацию по умолчанию, используя этот запрос:

SELECT is_local_cursor_default FROM sys.databases WHERE name = DB_NAME();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...