DECLARE CURSOR (Transact-SQL)DECLARE CURSOR (Transact-SQL)

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL DatabaseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database

Определяет такие атрибуты серверного курсора языка Transact-SQLTransact-SQL, как свойства просмотра и запрос, используемый для построения результирующего набора, на котором работает курсор.Defines the attributes of a Transact-SQLTransact-SQL server cursor, such as its scrolling behavior and the query used to build the result set on which the cursor operates. Инструкция DECLARE CURSOR поддерживает как синтаксис стандарта ISO, так и синтаксис, использующий набор расширений языка Transact-SQLTransact-SQL.DECLARE CURSOR accepts both a syntax based on the ISO standard and a syntax using a set of Transact-SQLTransact-SQL extensions.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

ISO Syntax  
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR   
     FOR select_statement   
     [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]  
[;]  
Transact-SQL Extended Syntax  
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]   
     [ FORWARD_ONLY | SCROLL ]   
     [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]   
     [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]   
     [ TYPE_WARNING ]   
     FOR select_statement   
     [ FOR UPDATE [ OF column_name [ ,...n ] ] ]  
[;]  

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

АргументыArguments

cursor_namecursor_name
Имя определенного серверного курсора Transact-SQLTransact-SQL.Is the name of the Transact-SQLTransact-SQL server cursor defined. Аргумент cursor_name должен соответствовать требованиям, предъявляемым к идентификаторам.cursor_name must conform to the rules for identifiers.

INSENSITIVEINSENSITIVE
Определяет курсор, который создает временную копию данных для использования курсором.Defines a cursor that makes a temporary copy of the data to be used by the cursor. Все запросы к курсору обращаются к указанной временной таблице в базе данных tempdb, поэтому изменения базовых таблиц не влияют на данные, возвращаемые выборками для данного курсора, а сам курсор не позволяет производить изменения.All requests to the cursor are answered from this temporary table in tempdb; therefore, modifications made to base tables are not reflected in the data returned by fetches made to this cursor, and this cursor does not allow modifications. Если при использовании синтаксиса ISO не указан параметр INSENSITIVE, зафиксированные обновления и удаления, сделанные в базовых таблицах, отображаются в последующих выборках.When ISO syntax is used, if INSENSITIVE is omitted, committed deletes and updates made to the underlying tables (by any user) are reflected in subsequent fetches.

SCROLLSCROLL
Указывает, что доступны все параметры выборки (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE).Specifies that all fetch options (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) are available. Если в инструкции DECLARE CURSOR стандарта ISO не указан параметр SCROLL, то поддерживается только параметр выборки NEXT.If SCROLL is not specified in an ISO DECLARE CURSOR, NEXT is the only fetch option supported. Если указан аргумент FAST_FORWARD, задать SCROLL невозможно.SCROLL cannot be specified if FAST_FORWARD is also specified. Если параметр SCROLL не указан, доступен только параметр выборки NEXT, и курсор становится FORWARD_ONLY.If SCROLL is not specified then only the fetch option NEXT is available and the cursor becomes FORWARD_ONLY.

select_statementselect_statement
Стандартная инструкция SELECT, которая определяет результирующий набор курсора.Is a standard SELECT statement that defines the result set of the cursor. Ключевые слова FOR BROWSE и INTO недопустимы в аргументе select_statement, входящем в объявление курсора.The keywords FOR BROWSE, and INTO are not allowed within select_statement of a cursor declaration.

SQL ServerSQL Server неявным образом преобразует курсор в другой тип, если предложения в аргументе select_statement вызывают конфликт с функциями курсора запрошенного типа.implicitly converts the cursor to another type if clauses in select_statement conflict with the functionality of the requested cursor type.

READ ONLYREAD ONLY
Предотвращает изменения, сделанные через этот курсор.Prevents updates made through this cursor. На курсов нельзя ссылаться в приложении WHERE CURRENT OF в инструкции UPDATE или DELETE.The cursor cannot be referenced in a WHERE CURRENT OF clause in an UPDATE or DELETE statement. Этот параметр имеет преимущество над установленной по умолчанию возможностью обновления курсора.This option overrides the default capability of a cursor to be updated.

UPDATE [OF column_name [,...n]]UPDATE [OF column_name [,...n]]
Определяет обновляемые столбцы в курсоре.Defines updatable columns within the cursor. Если OF <column_name> [, <... n>] указан, вносить изменения можно только в перечисленные столбцы.If OF <column_name> [, <... n>] is specified, only the columns listed allow modifications. Если инструкция UPDATE используется без списка столбцов, то обновление возможно для всех столбцов.If UPDATE is specified without a column list, all columns can be updated.

cursor_namecursor_name
Имя определенного серверного курсора Transact-SQLTransact-SQL.Is the name of the Transact-SQLTransact-SQL server cursor defined. Аргумент cursor_name должен соответствовать требованиям, предъявляемым к идентификаторам.cursor_name must conform to the rules for identifiers.

LOCALLOCAL
Указывает, что курсор является локальным по отношению к пакету, хранимой процедуре или триггеру, в котором он был создан.Specifies that the scope of the cursor is local to the batch, stored procedure, or trigger in which the cursor was created. Имя курсора допустимо только внутри этой области.The cursor name is only valid within this scope. На курсор могут ссылаться локальные переменные пакета, хранимые процедуры, триггеры или выходной параметр OUTPUT хранимой процедуры.The cursor can be referenced by local cursor variables in the batch, stored procedure, or trigger, or a stored procedure OUTPUT parameter. Параметр OUTPUT используется для передачи локального курсора вызывающему его пакету, хранимой процедуре или триггеру, который затем может присвоить параметр переменной курсора с целью последующего обращения к курсору после завершения хранимой процедуры.An OUTPUT parameter is used to pass the local cursor back to the calling batch, stored procedure, or trigger, which can assign the parameter to a cursor variable to reference the cursor after the stored procedure terminates. Курсор неявно освобождается после завершения выполнения пакета, хранимой процедуры или триггера, за исключением случая, когда курсор был передан параметру OUTPUT.The cursor is implicitly deallocated when the batch, stored procedure, or trigger terminates, unless the cursor was passed back in an OUTPUT parameter. Если курсор был передан параметру OUTPUT, то курсор освобождается при освобождении всех ссылающихся на него переменных или при выходе из области видимости.If it is passed back in an OUTPUT parameter, the cursor is deallocated when the last variable referencing it is deallocated or goes out of scope.

GLOBALGLOBAL
Указывает, что курсор является глобальным по отношению к соединению.Specifies that the scope of the cursor is global to the connection. Имя курсора может использоваться любой хранимой процедурой или пакетом, которые выполняются в соединении.The cursor name can be referenced in any stored procedure or batch executed by the connection. Курсор неявно освобождается только в случае разрыва соединения.The cursor is only implicitly deallocated at disconnect.

Примечание

Если не указан ни один из параметров GLOBAL или LOCAL, то значение по умолчанию управляется параметром default to local cursor базы данных.If neither GLOBAL or LOCAL is specified, the default is controlled by the setting of the default to local cursor database option.

FORWARD_ONLYFORWARD_ONLY
Указывает, что курсор может перемещаться только вперед и просматриваться от первой строки к последней.Specifies that the cursor can only move forward and be scrolled from the first to the last row. Поддерживается только параметр выборки FETCH NEXT.FETCH NEXT is the only supported fetch option. Результаты всех инструкций вставки, обновления и удаления, выполненных текущим пользователем (или зафиксированных другими пользователями) и влияющих на строки результирующего набора, отображаются по мере получения строк.All insert, update, and delete statements made by the current user (or committed by other users) that affect rows in the result set are visible as the rows are fetched. Так как курсор нельзя прокручивать назад, изменения, внесенные в строки базы данных после их извлечения, не видны через курсор.Because the cursor cannot be scrolled backward, however, changes made to rows in the database after the row was fetched are not visible through the cursor. Курсоры последовательного доступа по умолчанию являются динамическими. Это значит, что все изменения обнаруживаются в процессе обработки текущей строки.Forward-only cursors are dynamic by default, meaning that all changes are detected as the current row is processed. Благодаря этому курсор открывается быстрее, а в результирующем наборе отображаются изменения, внесенные в базовые таблицы.This provides faster cursor opening and enables the result set to display updates made to the underlying tables. Хотя курсоры последовательного доступа не поддерживают обратную прокрутку, приложения могут возвращаться в начало результирующего набора, закрывая и повторно открывая курсор.While forward-only cursors do not support backward scrolling, applications can return to the beginning of the result set by closing and reopening the cursor. Если параметр FORWARD_ONLY указан без ключевых слов STATIC, KEYSET или DYNAMIC, курсор работает как динамический.If FORWARD_ONLY is specified without the STATIC, KEYSET, or DYNAMIC keywords, the cursor operates as a dynamic cursor. Если не указан ни один из параметров FORWARD_ONLY или SCROLL, по умолчанию используется FORWARD_ONLY, пока не будут заданы ключевые слова STATIC, KEYSET или DYNAMIC.When neither FORWARD_ONLY nor SCROLL is specified, FORWARD_ONLY is the default, unless the keywords STATIC, KEYSET, or DYNAMIC are specified. Курсоры STATIC, KEYSET и DYNAMIC по умолчанию получают значение SCROLL.STATIC, KEYSET, and DYNAMIC cursors default to SCROLL. В отличие от API-интерфейсов базы данных, таких как ODBC и ADO, FORWARD_ONLY поддерживается с курсорами STATIC, KEYSET, и DYNAMIC Transact-SQLTransact-SQL.Unlike database APIs such as ODBC and ADO, FORWARD_ONLY is supported with STATIC, KEYSET, and DYNAMIC Transact-SQLTransact-SQL cursors.

STATICSTATIC
Указывает, что курсор всегда отображает результирующий набор в том виде, который он имел на момент первого открытия курсора, и создает временную копию данных, предназначенную для использования курсором.Specifies that the cursor always displays the result set as it was when the cursor was first opened, and makes a temporary copy of the data to be used by the cursor. Все запросы к курсору обращаются к этой временной таблице в базе данных tempdb.All requests to the cursor are answered from this temporary table in tempdb. Поэтому результаты инструкций вставки, обновления и удаления данных в базовых таблицах не влияют на данные, возвращаемые запросами на извлечение к курсору, и курсор не обнаруживает изменения, внесенные в членство, порядок или значения результирующего набора после открытия курсора.Therefore inserts, updates, and deletes made to base tables are not reflected in the data returned by fetches made to this cursor, and this cursor does not detect changes made to the membership, order, or values of the result set after the cursor is opened. Статические курсоры могут обнаруживать результаты собственных инструкций обновления, удаления и вставки, хотя это и не обязательно.Static cursors may detect their own updates, deletes, and inserts, although they are not required to do so. Например, предположим, что статический курсор извлекает строку, а другое приложение затем обновляет ее.For example, suppose a static cursor fetches a row, and another application then updates that row. Если приложение извлекает строку из статического курсора, оно получает значения без изменений, внесенных другим приложением.If the application refetches the row from the static cursor, the values it sees are unchanged, despite the changes made by the other application. Поддерживаются все типы прокрутки.All types of scrolling are supported.

KEYSETKEYSET
Указывает, что членство или порядок строк в курсоре неизменны при его открытии.Specifies that the membership and order of rows in the cursor are fixed when the cursor is opened. Набор ключей, однозначно определяющих строки, встроен в таблицу в базе данных tempdb с именем keyset.The set of keys that uniquely identify the rows is built into a table in tempdb known as the keyset. Возможности этого курсора по обнаружению изменений с одной стороны похожи на возможности статического курсора, а с другой — динамического.This cursor provides functionality between a static and a dynamic cursor in its ability to detect changes. Так же как статический курсор, он не всегда обнаруживает изменения, внесенные в членство и порядок элементов результирующего набора.Like a static cursor, it does not always detect changes to the membership and order of the result set. Так же как динамический курсор, он обнаруживает изменения, внесенные в значения строк результирующего набора.Like a dynamic cursor, it does detect changes to the values of rows in the result set. Такие курсоры управляются с помощью набора уникальных идентификаторов — ключей.Keyset-driven cursors are controlled by a set of unique identifiers (keys) known as the keyset. Ключи создаются из набора столбцов, который уникально идентифицирует строки результирующего набора.The keys are built from a set of columns that uniquely identify the rows in the result set. Набор ключей — это набор ключевых значений всех строк, возвращаемых инструкцией запроса.The keyset is the set of key values from all the rows returned by the query statement. При использовании управляемых наборами ключей курсоров ключ создается для каждой строки курсора и сохраняется на клиентском компьютере или на сервере.With keyset-driven cursors, a key is built and saved for each row in the cursor and stored either on the client workstation or on the server. При обращении к строке сохраненный ключ используется для получения текущих значений данных из источника данных.When you access each row, the stored key is used to fetch the current data values from the data source. В курсоре, управляемом набором ключей, членство в результирующем наборе становится фиксированным, когда набор ключей полностью заполняется.In a keyset-driven cursor, result set membership is frozen when the keyset is fully populated. Поэтому результаты операций добавления и обновления, влияющих на членство, не включаются в результирующий набор до повторного открытия.Thereafter, additions or updates that affect membership are not a part of the result set until it is reopened. Изменения в значениях данных (внесенные владельцем набора ключей или другими процессами) видны при прокрутке результирующего набора пользователем.Changes to data values (made either by the keyset owner or other processes) are visible as the user scrolls through the result set:

  • Если строка удаляется, при попытке выбрать ее возвращается @@FETCH_STATUS со значением –2, так как удаленная строка отображается как пробел в результирующем наборе.If a row is deleted, an attempt to fetch the row returns an @@FETCH_STATUS of -2 because the deleted row appears as a gap in the result set. В наборе ключей ключ для этой строки есть, но самой строки в результирующем наборе больше нет.The key for the row exists in the keyset, but the row no longer exists in the result set.
  • Чтобы результаты вставки извне курсора (другими процессами) были видны, нужно закрыть курсор и открыть его заново.Inserts made outside the cursor (by other processes) are visible only if the cursor is closed and reopened. Результаты вставки внутри курсора видны в конце результирующего набора.Inserts made from inside the cursor are visible at the end of the result set.
  • Обновления значений ключа из-за границ курсора аналогично удалению старой строки с последующей вставкой новой строки.Updates of key values from outside the cursor resemble a delete of the old row followed by an insert of the new row. Строка с новыми значениями невидима, и при попытке извлечь строку со старыми значениями функция @@FETCH_STATUS возвращает значение –2.The row with the new values is not visible, and attempts to fetch the row with the old values return an @@FETCH_STATUS of -2. Обновления видимы сразу, если они сделаны через курсор с помощью предложения WHERE CURRENT OF.The new values are visible if the update is done through the cursor by specifying the WHERE CURRENT OF clause.

Примечание

Если запрос ссылается хотя бы на одну таблицу, не имеющую уникального индекса, курсор keyset преобразуется в статический курсор.If the query references at least one table without a unique index, the keyset cursor is converted to a static cursor.

DYNAMICDYNAMIC
Определяет курсор, который отображает все изменения данных, сделанные в строках результирующего набора, при просмотре этого курсора и извлечении новой записи независимо от того, были ли изменения произведены внутри курсора или извне другими пользователями.Defines a cursor that reflects all data changes made to the rows in its result set as you scroll around the cursor and fetch a new record, regardless of whether the changes occur from inside the cursor or by other users outside the cursor. Поэтому посредством такого курсора видны результаты всех инструкций вставки, обновления и удаления, выполненных всеми пользователями.Therefore all insert, update, and delete statements made by all users are visible through the cursor. Значения данных, порядок и членство строк в каждой выборке могут меняться.The data values, order, and membership of the rows can change on each fetch. Параметр выборки ABSOLUTE динамическими курсорами не поддерживается.The ABSOLUTE fetch option is not supported with dynamic cursors. Обновления, сделанные вне курсора, не видны до момента фиксации (если только уровень изоляции транзакций с курсорами не имеет значение UNCOMMITTED).Updates made outside the cursor are not visible until they are committed (unless the cursor transaction isolation level is set to UNCOMMITTED). Например, предположим, что динамический курсор извлекает две строки, а другое приложение затем обновляет одну из них и удаляет другую.For example, suppose a dynamic cursor fetches two rows and another application then updates one of those rows and deletes the other. Если после этого динамический курсор снова извлекает эти две строки, он не найдет удаленную строку, а для обновленной строки отобразит новые значения.If the dynamic cursor then fetches those rows, it will not find the deleted row, but it will display the new values for the updated row.

FAST_FORWARDFAST_FORWARD
Указывает курсор FORWARD_ONLY, READ_ONLY, для которого включена оптимизация производительности.Specifies a FORWARD_ONLY, READ_ONLY cursor with performance optimizations enabled. Если указан SCROLL или FOR_UPDATE, задать FAST_FORWARD невозможно.FAST_FORWARD cannot be specified if SCROLL or FOR_UPDATE is also specified. Курсоры такого типа не допускают изменений данных внутри курсора.This type of cursor does not allow data modifications from inside the cursor.

Примечание

FAST_FORWARD и FORWARD_ONLY можно использовать в одной инструкции DECLARE CURSOR.Both FAST_FORWARD and FORWARD_ONLY can be used in the same DECLARE CURSOR statement.

READ_ONLYREAD_ONLY
Предотвращает изменения, сделанные через этот курсор.Prevents updates made through this cursor. На курсов нельзя ссылаться в приложении WHERE CURRENT OF в инструкции UPDATE или DELETE.The cursor cannot be referenced in a WHERE CURRENT OF clause in an UPDATE or DELETE statement. Этот параметр имеет преимущество над установленной по умолчанию возможностью обновления курсора.This option overrides the default capability of a cursor to be updated.

SCROLL_LOCKSSCROLL_LOCKS
Указывает, что позиционированные обновления или удаления, осуществляемые с помощью курсора, гарантированно будут выполнены успешно.Specifies that positioned updates or deletes made through the cursor are guaranteed to succeed. SQL ServerSQL Server блокирует строки по мере их считывания в курсор для обеспечения доступности этих строк для последующих изменений.locks the rows as they are read into the cursor to ensure their availability for later modifications. Если указан FAST_FORWARD или STATIC, задать SCROLL_LOCKS невозможно.SCROLL_LOCKS cannot be specified if FAST_FORWARD or STATIC is also specified.

OPTIMISTICOPTIMISTIC
Указывает, что позиционированные обновления или удаления, осуществляемые с помощью курсора, не будут выполнены, если с момента считывания в курсор строка была обновлена.Specifies that positioned updates or deletes made through the cursor do not succeed if the row has been updated since it was read into the cursor. SQL ServerSQL Server не блокирует строки по мере их считывания в курсор.does not lock rows as they are read into the cursor. Вместо этого используются сравнения значений столбца timestamp или значений контрольных сумм, если в таблице нет столбца timestamp, для определения факта изменения строки после ее считывания в курсор.It instead uses comparisons of timestamp column values, or a checksum value if the table has no timestamp column, to determine whether the row was modified after it was read into the cursor. Если строка была изменена, то попытки позиционированного обновления или удаления будут безрезультатными.If the row was modified, the attempted positioned update or delete fails. Если указан аргумент FAST_FORWARD, задать OPTIMISTIC невозможно.OPTIMISTIC cannot be specified if FAST_FORWARD is also specified.

TYPE_WARNINGTYPE_WARNING
Указывает, что клиенту будет отправлено предупреждение, если курсор неявно будет преобразован из одного запрашиваемого типа в другой.Specifies that a warning message is sent to the client when the cursor is implicitly converted from the requested type to another.

select_statementselect_statement
Стандартная инструкция SELECT, которая определяет результирующий набор курсора.Is a standard SELECT statement that defines the result set of the cursor. Ключевые слова COMPUTE, COMPUTE BY, FOR BROWSE и INTO недопустимы в аргументе select_statement, входящем в объявление курсора.The keywords COMPUTE, COMPUTE BY, FOR BROWSE, and INTO are not allowed within select_statement of a cursor declaration.

Примечание

В объявлении курсора можно использовать указание запроса, но если используется предложение FOR UPDATE OF, то после FOR UPDATE OF следует указать параметр OPTION (<query_hint>).You can use a query hint within a cursor declaration; however, if you also use the FOR UPDATE OF clause, specify OPTION (<query_hint>) after FOR UPDATE OF.

SQL ServerSQL Server неявным образом преобразует курсор в другой тип, если предложения в аргументе select_statement вызывают конфликт с функциями курсора запрошенного типа.implicitly converts the cursor to another type if clauses in select_statement conflict with the functionality of the requested cursor type. Дополнительные сведения см. в разделе "Неявные преобразования курсора".For more information, see Implicit Cursor Conversions.

FOR UPDATE [OF column_name [,...n]]FOR UPDATE [OF column_name [,...n]]
Определяет обновляемые столбцы в курсоре.Defines updatable columns within the cursor. Если OF <column_name> [, <... n>] определено, только перечисленные столбцы позволяют вносить изменения.If OF <column_name> [, <... n>] is supplied, only the columns listed allow modifications. Если инструкция UPDATE используется без списка столбцов, то обновление возможно для всех столбцов, за исключением случая, когда был указан параметр параллелизма READ_ONLY.If UPDATE is specified without a column list, all columns can be updated, unless the READ_ONLY concurrency option was specified.

RemarksRemarks

DECLARE CURSOR определяет такие атрибуты серверного курсора языка Transact-SQLTransact-SQL, как свойства просмотра и запрос, используемый для построения результирующего набора, на котором работает курсор.DECLARE CURSOR defines the attributes of a Transact-SQLTransact-SQL server cursor, such as its scrolling behavior and the query used to build the result set on which the cursor operates. Инструкция OPEN заполняет результирующий набор, а оператор FETCH возвращает из него строку.The OPEN statement populates the result set, and FETCH returns a row from the result set. Инструкция CLOSE очищает текущий результирующий набор, связанный с курсором.The CLOSE statement releases the current result set associated with the cursor. Инструкция DEALLOCATE освобождает ресурсы, используемые курсором.The DEALLOCATE statement releases the resources used by the cursor.

Первая форма инструкции DECLARE CURSOR использует синтаксис ISO для задания параметров работы курсора.The first form of the DECLARE CURSOR statement uses the ISO syntax for declaring cursor behaviors. Вторая форма инструкции DECLARE CURSOR использует расширения языка Transact-SQLTransact-SQL, позволяющие определять курсоры с помощью таких же типов, как типы, используемые в курсорных функциях API баз данных, таких как ODBC и ADO.The second form of DECLARE CURSOR uses Transact-SQLTransact-SQL extensions that allow you to define cursors using the same cursor types used in the database API cursor functions of ODBC or ADO.

Нельзя смешивать две эти формы.You cannot mix the two forms. Если вы определяете ключевые слова SCROLL или INSENSITIVE до ключевого слова CURSOR, вы не сможете использовать никакие ключевые слова между ключевыми словами CURSOR и FOR <select_statement>.If you specify the SCROLL or INSENSITIVE keywords before the CURSOR keyword, you cannot use any keywords between the CURSOR and FOR <select_statement> keywords. Если вы указываете ключевые слова между ключевыми словами CURSOR и FOR <select_statement>, вы не сможете задать SCROLL или INSENSITIVE перед ключевым словом CURSOR.If you specify any keywords between the CURSOR and FOR <select_statement> keywords, you cannot specify SCROLL or INSENSITIVE before the CURSOR keyword.

Если DECLARE CURSOR с помощью синтаксиса Transact-SQLTransact-SQL не указывает READ_ONLY, OPTIMISTIC или SCROLL_LOCKS, значение по умолчанию выглядит следующим образом:If a DECLARE CURSOR using Transact-SQLTransact-SQL syntax does not specify READ_ONLY, OPTIMISTIC, or SCROLL_LOCKS, the default is as follows:

  • Если инструкция SELECT не поддерживает обновления (или недостаточно разрешений, или при доступе к удаленным таблицам, не поддерживающим обновление, и т. п.), то курсору присваивается параметр READ_ONLY.If the SELECT statement does not support updates (insufficient permissions, accessing remote tables that do not support updates, and so on), the cursor is READ_ONLY.

  • Курсоры STATIC и FAST_FORWARD по умолчанию получают значение READ_ONLY.STATIC and FAST_FORWARD cursors default to READ_ONLY.

  • Курсоры DYNAMIC и KEYSET по умолчанию получают значение OPTIMISTIC.DYNAMIC and KEYSET cursors default to OPTIMISTIC.

Ссылки на курсоры могут производиться только другими инструкциями языка Transact-SQLTransact-SQL.Cursor names can be referenced only by other Transact-SQLTransact-SQL statements. Функции API баз данных не могут ссылаться на курсоры.They cannot be referenced by database API functions. Например, после объявления курсора функции и методы OLE DB, ODBC или ADO не могут ссылаться на его имя.For example, after declaring a cursor, the cursor name cannot be referenced from OLE DB, ODBC or ADO functions or methods. Строки курсора не могут быть выбраны с помощью соответствующих функций и методов API; для этой цели необходимо использовать инструкции FETCH языка Transact-SQLTransact-SQL.The cursor rows cannot be fetched using the fetch functions or methods of the APIs; the rows can be fetched only by Transact-SQLTransact-SQL FETCH statements.

Приведенные ниже хранимые процедуры могут быть использованы для определения свойств курсора после его объявления.After a cursor has been declared, these system stored procedures can be used to determine the characteristics of the cursor.

Системные хранимые процедурыSystem stored procedures ОписаниеDescription
sp_cursor_listsp_cursor_list Возвращает список курсоров, доступных для соединения в настоящий момент времени, а также их атрибуты.Returns a list of cursors currently visible on the connection and their attributes.
sp_describe_cursorsp_describe_cursor Описывает атрибуты курсора, например имеет ли он тип "forward-only" или "scrolling".Describes the attributes of a cursor, such as whether it is a forward-only or scrolling cursor.
sp_describe_cursor_columnssp_describe_cursor_columns Описывает атрибуты столбцов результирующего набора.Describes the attributes of the columns in the cursor result set.
sp_describe_cursor_tablessp_describe_cursor_tables Описывает базовые таблицы, к которым курсор получает доступ.Describes the base tables accessed by the cursor.

Переменные могут использоваться в качестве составных частей выражения select_statement, объявляющего курсор.Variables may be used as part of the select_statement that declares a cursor. Значения переменных курсора после его объявления не изменяются.Cursor variable values do not change after a cursor is declared.

РазрешенияPermissions

По умолчанию разрешения DECLARE CURSORпредоставляются всем пользователям, имеющим разрешения SELECT для используемых курсором представлений, таблиц и столбцов.Permissions of DECLARE CURSOR default to any user that has SELECT permissions on the views, tables, and columns used in the cursor.

ОграниченияLimitations and Restrictions

Нельзя использовать курсоры или триггеры в таблице с кластеризованным индексом columnstore.You cannot use cursors or triggers on a table with a clustered columnstore index. Это ограничение не применяется к некластеризованным индексам columnstore. Курсоры и триггеры можно использовать в таблице с некластеризованным индексом columnstore.This restriction does not apply to nonclustered columnstore indexes; you can use cursors and triggers on a table with a nonclustered columnstore index.

ПримерыExamples

A.A. Использование простого курсора и синтаксисаUsing simple cursor and syntax

Результирующий набор, создаваемый при открытии данного курсора, включает в себя все строки и столбцы таблицы.The result set generated at the opening of this cursor includes all rows and all columns in the table. Этот курсор можно обновлять, все обновления и удаления представлены в выборке для этого курсора.This cursor can be updated, and all updates and deletes are represented in fetches made against this cursor. FETCH NEXT является единственно доступной выборкой, так как параметр SCROLL не был определен.FETCH NEXT is the only fetch available because the SCROLL option has not been specified.

DECLARE vend_cursor CURSOR  
    FOR SELECT * FROM Purchasing.Vendor  
OPEN vend_cursor  
FETCH NEXT FROM vend_cursor;  

Б.B. Использование вложенных курсоров для вывода отчетаUsing nested cursors to produce report output

В следующем примере вложенные курсоры используются для вывода сложного отчета.The following example shows how cursors can be nested to produce complex reports. Для каждого поставщика объявляется внутренний курсор.The inner cursor is declared for each vendor.

SET NOCOUNT ON;  
  
DECLARE @vendor_id int, @vendor_name nvarchar(50),  
    @message varchar(80), @product nvarchar(50);  
  
PRINT '-------- Vendor Products Report --------';  
  
DECLARE vendor_cursor CURSOR FOR   
SELECT VendorID, Name  
FROM Purchasing.Vendor  
WHERE PreferredVendorStatus = 1  
ORDER BY VendorID;  
  
OPEN vendor_cursor  
  
FETCH NEXT FROM vendor_cursor   
INTO @vendor_id, @vendor_name  
  
WHILE @@FETCH_STATUS = 0  
BEGIN  
    PRINT ' '  
    SELECT @message = '----- Products From Vendor: ' +   
        @vendor_name  
  
    PRINT @message  
  
    -- Declare an inner cursor based     
    -- on vendor_id from the outer cursor.  
  
    DECLARE product_cursor CURSOR FOR   
    SELECT v.Name  
    FROM Purchasing.ProductVendor pv, Production.Product v  
    WHERE pv.ProductID = v.ProductID AND  
    pv.VendorID = @vendor_id  -- Variable value from the outer cursor  
  
    OPEN product_cursor  
    FETCH NEXT FROM product_cursor INTO @product  
  
    IF @@FETCH_STATUS <> 0   
        PRINT '         <<None>>'       
  
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
  
        SELECT @message = '         ' + @product  
        PRINT @message  
        FETCH NEXT FROM product_cursor INTO @product  
        END  
  
    CLOSE product_cursor  
    DEALLOCATE product_cursor  
        -- Get the next vendor.  
    FETCH NEXT FROM vendor_cursor   
    INTO @vendor_id, @vendor_name  
END   
CLOSE vendor_cursor;  
DEALLOCATE vendor_cursor;  

См. также:See Also

@@FETCH_STATUS (Transact-SQL) @@FETCH_STATUS (Transact-SQL)
CLOSE (Transact-SQL) CLOSE (Transact-SQL)
Курсоры (Transact-SQL) Cursors (Transact-SQL)
DEALLOCATE (Transact-SQL) DEALLOCATE (Transact-SQL)
FETCH (Transact-SQL) FETCH (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
sp_configure (Transact-SQL)sp_configure (Transact-SQL)