КурсорыCursors

Операции в реляционной базе данных выполняются над множеством строк.Operations in a relational database act on a complete set of rows. Например, набор строк, возвращаемый инструкцией SELECT, содержит все строки, которые удовлетворяют условиям, указанным в предложении WHERE инструкции.For example, the set of rows returned by a SELECT statement consists of all the rows that satisfy the conditions in the WHERE clause of the statement. Такой полный набор строк, возвращаемых инструкцией, называется результирующим набором.This complete set of rows returned by the statement is known as the result set. Приложения, особенно интерактивные, не всегда эффективно работают с результирующим набором как с единым целым.Applications, especially interactive online applications, cannot always work effectively with the entire result set as a unit. Им нужен механизм, позволяющий обрабатывать одну строку или небольшое их число за один раз.These applications need a mechanism to work with one row or a small block of rows at a time. Курсоры являются расширением результирующих наборов, которые предоставляют такой механизм.Cursors are an extension to result sets that provide that mechanism.

Курсоры позволяют усовершенствовать обработку результатов:Cursors extend result processing by:

  • позиционируясь на отдельные строки результирующего набора;Allowing positioning at specific rows of the result set.

  • получая одну или несколько строк от текущей позиции в результирующем наборе;Retrieving one row or block of rows from the current position in the result set.

  • поддерживая изменение данных в строках в текущей позиции результирующего набора;Supporting data modifications to the rows at the current position in the result set.

  • поддерживая разные уровни видимости изменений, сделанных другими пользователями для данных, представленных в результирующем наборе;Supporting different levels of visibility to changes made by other users to the database data that is presented in the result set.

  • предоставляя инструкциям Transact-SQLTransact-SQL в скриптах, хранимых процедурах и триггерах доступ к данным результирующего набора.Providing Transact-SQLTransact-SQL statements in scripts, stored procedures, and triggers access to the data in a result set.

Основные понятияConcepts

Реализации курсоровCursor Implementations
SQL ServerSQL Server поддерживает три способа реализации курсоров.supports three cursor implementations.

курсоры Transact-SQLTransact-SQL cursors
Основаны на синтаксисе DECLARE CURSOR и в основном используются в скриптах, хранимых процедурах и триггерах Transact-SQLTransact-SQL .Are based on the DECLARE CURSOR syntax and are used mainly in Transact-SQLTransact-SQL scripts, stored procedures, and triggers. Transact-SQLTransact-SQL реализуются на сервере и управляются инструкциями Transact-SQLTransact-SQL , отправляемыми от клиента серверу.cursors are implemented on the server and are managed by Transact-SQLTransact-SQL statements sent from the client to the server. Они также могут содержаться в пакетах, хранимых процедурах или триггерах.They may also be contained in batches, stored procedures, or triggers.

Серверные курсоры интерфейса прикладного программирования (API)Application programming interface (API) server cursors
Поддерживают функции курсоров API в OLE DB и ODBC.Support the API cursor functions in OLE DB and ODBC. Курсоры API реализуются на сервере.API server cursors are implemented on the server. Всякий раз, когда клиентское приложение вызывает функцию курсора API, поставщик OLE DB или драйвер ODBC для собственного клиента SQL ServerSQL Server передает требование на сервер для выполнения действия в отношении серверного курсора API.Each time a client application calls an API cursor function, the SQL ServerSQL Server Native Client OLE DB provider or ODBC driver transmits the request to the server for action against the API server cursor.

Клиентские курсорыClient cursors
Реализуются внутренне драйвером ODBC для собственного клиента SQL ServerSQL Server и DLL, реализующим API-интерфейс ADO.Are implemented internally by the SQL ServerSQL Server Native Client ODBC driver and by the DLL that implements the ADO API. Клиентские курсоры реализуются посредством кэширования всех строк результирующего набора на клиенте.Client cursors are implemented by caching all the result set rows on the client. Каждый раз, когда клиентское приложение вызывает функцию курсора API, драйвер ODBC для собственного клиента SQL ServerSQL Server или ADO DLL выполняет операцию курсора на строках результирующего набора, кэшированных на клиенте.Each time a client application calls an API cursor function, the SQL ServerSQL Server Native Client ODBC driver or the ADO DLL performs the cursor operation on the result set rows cached on the client.

Типы курсоровType of Cursors
ОднонаправленныйForward-only
Курсор последовательного доступа не поддерживает прокрутку, он поддерживает только последовательную выборку строк от начала курсора до его конца.A forward-only cursor does not support scrolling; it supports only fetching the rows serially from the start to the end of the cursor. Строки нельзя получить из базы данных, пока они не будут выбраны.The rows are not retrieved from the database until they are fetched. Результаты всех инструкций INSERT, UPDATE и DELETE, влияющих на строки результирующего набора (выполненных текущим пользователем или зафиксированных другими пользователями), отображаются как строки, выбранные из курсора.The effects of 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 from the cursor.

Так как курсор не может быть прокручен назад, большинство изменений, сделанных в строках базы данных после извлечения сроки, не видны через курсор.Because the cursor cannot be scrolled backward, most changes made to rows in the database after the row was fetched are not visible through the cursor. Если значение, использованное для определения положения строки в результирующем наборе, модифицируется, например в случае обновления столбца, входящего в кластеризованный индекс, то значение видимо через курсор.In cases where a value used to determine the location of the row within the result set is modified, such as updating a column covered by a clustered index, the modified value is visible through the cursor.

Хотя в моделях курсоров API базы данных курсор последовательного доступа рассматривается как курсор отдельного типа, в SQL ServerSQL Server принят другой подход.Although the database API cursor models consider a forward-only cursor to be a distinct type of cursor, SQL ServerSQL Server does not. SQL ServerSQL Server принимает однонаправленность и возможность прокрутки курсоров как параметры, которые могут быть применены к статическим, управляемым набором ключей и динамическим курсорам.considers both forward-only and scroll as options that can be applied to static, keyset-driven, and dynamic cursors. Transact-SQLTransact-SQL курсоры поддерживают однонаправленные статические, управляемые набором ключей и динамические курсоры.cursors support forward-only static, keyset-driven, and dynamic cursors. Модели курсора API базы данных предполагают, что статические, управляемые набором ключей и динамические курсоры всегда могут быть прокручены.The database API cursor models assume that static, keyset-driven, and dynamic cursors are always scrollable. Если атрибут или свойство курсора API базы данных установлены в значение «однонаправленный», SQL ServerSQL Server реализует это как однонаправленный динамический курсор.When a database API cursor attribute or property is set to forward-only, SQL ServerSQL Server implements this as a forward-only dynamic cursor.

СтатическиеStatic
Полный результирующий набор статического курсора создается в базе данных tempdb при открытии курсора.The complete result set of a static cursor is built in tempdb when the cursor is opened. Статический курсор всегда отображает результирующий набор точно в том виде, в котором он был при открытии курсора.A static cursor always displays the result set as it was when the cursor was opened. Статическими курсорами обнаруживаются лишь некоторые изменения или не обнаруживаются вовсе, но при этом в процессе прокрутки такие курсоры потребляют сравнительно мало ресурсов.Static cursors detect few or no changes, but consume relatively few resources while scrolling.

Курсор не отражает изменения в базе данных, влияющие на вхождение в результирующий набор или изменяющие значения в столбцах строк, составляющих набор строк.The cursor does not reflect any changes made in the database that affect either the membership of the result set or changes to the values in the columns of the rows that make up the result set. Статический курсор не отображает новые строки, вставленные в базу данных после открытия курсора, даже если они соответствуют критериям поиска инструкции SELECT курсора.A static cursor does not display new rows inserted in the database after the cursor was opened, even if they match the search conditions of the cursor SELECT statement. Если входящие в результирующий набор строки обновляются другими пользователями, то новые значения данных в статическом курсоре не отображаются.If rows making up the result set are updated by other users, the new data values are not displayed in the static cursor. Статический курсор продолжает отображать строки, удаленные из базы данных после открытия курсора.The static cursor displays rows deleted from the database after the cursor was opened. Операции UPDATE, INSERT и DELETE не отображаются в статическом курсоре (до тех пор, пока курсор не будет закрыт и открыт повторно), не отображаются даже изменения, сделанные в том же соединении, в котором был открыт курсор.No UPDATE, INSERT, or DELETE operations are reflected in a static cursor (unless the cursor is closed and reopened), not even modifications made using the same connection that opened the cursor.

SQL ServerSQL Server статические курсоры всегда доступны только для чтения.static cursors are always read-only.

Так как результирующий набор статического курсора хранится в рабочей таблице базы данных tempdb, то размер строк результирующего набора не может превышать максимальный размер строк таблицы SQL ServerSQL Server .Because the result set of a static cursor is stored in a work table in tempdb, the size of the rows in the result set cannot exceed the maximum row size for a SQL ServerSQL Server table.

Transact-SQLTransact-SQL использует для описания статических курсоров термин «нечувствительный».uses the term insensitive for static cursors. Некоторые интерфейсы API баз данных называют их курсорами моментальных снимков.Some database APIs identify them as snapshot cursors.

KeysetKeyset
Членство и порядок строк в курсоре, управляемом набором ключей, являются фиксированными при открытии курсора.The membership and order of rows in a keyset-driven cursor are fixed when the cursor is opened. Такие курсоры управляются с помощью набора уникальных идентификаторов — ключей.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. Набор ключей — это набор ключевых значений всех строк, попадающих под действие инструкции SELECT на момент открытия курсора.The keyset is the set of the key values from all the rows that qualified for the SELECT statement at the time the cursor was opened. Набор ключей, управляющий курсором, создается в базе данных tempdb при открытии курсора.The keyset for a keyset-driven cursor is built in tempdb when the cursor is opened.

ДинамическийDynamic
Динамические курсоры — это противоположность статических курсоров.Dynamic cursors are the opposite of static cursors. Динамические курсоры отражают все изменения строк в результирующем наборе при прокрутке курсора.Dynamic cursors reflect all changes made to the rows in their result set when scrolling through the cursor. Значения типа данных, порядок и членство строк в результирующем наборе могут меняться для каждой выборки.The data values, order, and membership of the rows in the result set can change on each fetch. Все инструкции UPDATE, INSERT и DELETE, выполняемые пользователями, видимы посредством курсора.All UPDATE, INSERT, and DELETE statements made by all users are visible through the cursor. Обновление видимы сразу, если они сделаны посредством курсора с помощью либо API-функции (например, SQLSetPos ), либо предложения WHERE CURRENT OF Transact-SQLTransact-SQL .Updates are visible immediately if they are made through the cursor using either an API function such as SQLSetPos or the Transact-SQLTransact-SQL WHERE CURRENT OF clause. Обновления, сделанные вне курсора, не видны до момента фиксации, если только уровень изоляции транзакций с курсорами не имеет значение READ UNCOMMITTED.Updates made outside the cursor are not visible until they are committed, unless the cursor transaction isolation level is set to read uncommitted. В планах динамических курсоров никогда не используются пространственные индексы.Dynamic cursor plans never use spatial indexes.

Запрос курсораRequesting a Cursor

SQL ServerSQL Server поддерживает два метода запроса курсоров.supports two methods for requesting a cursor:

  • Transact-SQLTransact-SQL

    Язык Transact-SQLTransact-SQL поддерживает синтаксис для использования курсоров, созданных в соответствии с синтаксисом курсоров ISO.The Transact-SQLTransact-SQL language supports a syntax for using cursors modeled after the ISO cursor syntax.

  • API-функции курсоров базы данных.Database application programming interface (API) cursor functions

    SQL ServerSQL Server поддерживает функциональность курсоров для следующих API-интерфейсов баз данных:supports the cursor functionality of these database APIs:

    • ADO (MicrosoftMicrosoft ActiveX Data Object);ADO (MicrosoftMicrosoft ActiveX Data Object)

    • OLE DBOLE DB

    • открытый интерфейс доступа к базам данных (ODBC).ODBC (Open Database Connectivity)

Оба этих способа никогда не должны использоваться в приложении одновременно.An application should never mix these two methods of requesting a cursor. Приложение, применяющее API-интерфейс для определения режима работы курсоров, не может затем выполнить инструкцию Transact-SQLTransact-SQL DECLARE CURSOR для запроса нового курсора Transact-SQLTransact-SQL .An application that has used the API to specify cursor behaviors should not then execute a Transact-SQLTransact-SQL DECLARE CURSOR statement to also request a Transact-SQLTransact-SQL cursor. Инструкция DECLARE CURSOR может использоваться только в том случае, если все атрибуты API-курсоров будут установлены в значения по умолчанию.An application should only execute DECLARE CURSOR if it has set all the API cursor attributes back to their defaults.

Если не был запрошен ни Transact-SQLTransact-SQL , ни API-курсор, SQL ServerSQL Server целиком возвращает по умолчанию результирующий набор приложению (это называется результирующим набором по умолчанию).If neither a Transact-SQLTransact-SQL nor API cursor has been requested, SQL ServerSQL Server defaults to returning a complete result set, known as a default result set, to the application.

Обработка курсоровCursor Process

Transact-SQLTransact-SQL и API-курсоры имеют различный синтаксис, но для всех курсоров SQL ServerSQL Server используется одинаковый цикл обработки.cursors and API cursors have different syntax, but the following general process is used with all SQL ServerSQL Server cursors:

  1. Связать курсор с результирующим набором инструкции Transact-SQLTransact-SQL и задать его характеристики (например возможность обновления строк).Associate a cursor with the result set of a Transact-SQLTransact-SQL statement, and define characteristics of the cursor, such as whether the rows in the cursor can be updated.

  2. Выполнить инструкцию Transact-SQLTransact-SQL для заполнения курсора.Execute the Transact-SQLTransact-SQL statement to populate the cursor.

  3. Получить в курсор необходимые строки.Retrieve the rows in the cursor you want to see. Операция получения в курсор одной и более строк называется выборкой.The operation to retrieve one row or one block of rows from a cursor is called a fetch. Выполнение серии выборок для получения строк в прямом или обратном направлении называется прокруткой.Performing a series of fetches to retrieve rows in either a forward or backward direction is called scrolling.

  4. При необходимости выполнить операции изменения (обновления или удаления) строки в текущей позиции курсора.Optionally, perform modification operations (update or delete) on the row at the current position in the cursor.

  5. Закрыть курсор.Close the cursor.

Cursor Behaviors How Cursors Are ImplementedCursor Behaviors How Cursors Are Implemented

См. такжеSee Also

DECLARE CURSOR (Transact-SQL) DECLARE CURSOR (Transact-SQL)
Курсоры (Transact-SQL) Cursors (Transact-SQL)
Функции работы с курсорами (Transact-SQL) Cursor Functions (Transact-SQL)
Хранимые процедуры курсора (Transact-SQL)Cursor Stored Procedures (Transact-SQL)