Преимущества использования переменной курсора в SQL Server (объявление курсора @cn) - PullRequest
7 голосов
/ 22 ноября 2010

В T-SQL курсор может быть объявлен двумя способами (о которых я знаю):

  1. declare CursorName cursor for ...
  2. declare @CursorName cursor

Я провел несколько тестов и заметил, что создание переменной курсора не добавит запись к результату sp_cursor_list.

Есть ли какие-либо преимущества / недостатки в использовании второго подхода с точки зрения производительности, использования ресурсов и т. Д.?

PS: Мне известны потенциальные проблемы с производительностью курсора. Я не прошу сравнения курсоров с множеством на основе. Или курсор против while с переменной temp / table.

Ответы [ 3 ]

6 голосов
/ 07 июня 2013

Существует еще одно преимущество использования синтаксиса DECLARE @local_variable CURSOR, который я только что обнаружил.

Преимущество возникает, когда одна хранимая процедура вызывает другую, и в обеих процедурах одновременно открыты курсоры. Если DECLARE cursor_name CURSOR используется для определения курсоров, и обе процедуры используют одно и то же имя курсора, тогда вы получите

Сообщение 16915: курсор с именем 'имя_курсора' уже существует.

С другой стороны, если DECLARE @local_variable CURSOR используется для определения курсоров в родительских и дочерних хранимых процедурах, тогда @local_variable является локальным для каждой процедуры, и конфликт отсутствует Для тех, кто не использовал этот метод раньше, вот пример, использующий @C в качестве локальной переменной:

DECLARE @C AS CURSOR;

SET @C = CURSOR FOR SELECT ...;

OPEN @C;

FETCH NEXT FROM @C INTO ...;

...

4 голосов
/ 22 ноября 2010

Из того, что я прочитал, цель переменной курсора состоит в том, чтобы иметь возможность использовать ее в качестве выходной переменной в хранимом процессе, что позволяет отправлять данные в курсоре в другой управляющий процесс. Я не пробовал это, поэтому я не знаю точно, как это будет работать, но это то, что я получаю, читая Books Online. Я был бы удивлен, если есть какая-либо измеримая разница в производительности и, конечно, не то улучшение, которое вы могли бы получить, не используя курсор в первую очередь. Если вы не планируете использовать его в качестве выходной переменной, я бы посоветовал придерживаться более распространенного определения курсора, что облегчит поддержку кода.

Тем не менее, есть очень и очень мало случаев, когда на самом деле нужен курсор.

0 голосов
/ 22 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...