Серверные курсоры API

API-интерфейсы OLE DB, ODBC и ADO поддерживают сопоставление курсоров с результирующими наборами выполненных инструкций SQL. Поставщик OLE DB для собственного клиента Microsoft SQL Server и драйвер ODBC для собственного клиента SQL Server реализуют эти операции при помощи серверных курсоров API. Серверные курсоры API — это курсоры, которые реализованы на сервере и управляются курсорными функциями API. При обращении приложения к курсорным функциям API операция с курсором переносится на сервер поставщиком OLE DB или драйвером ODBC.

При использовании серверного курсора API в интерфейсах OLE DB, ODBC и ADO используйте функции и методы API, чтобы выполнить следующие операции.

  1. Установить соединение.

  2. Задать атрибуты или свойства, определяющие характеристики курсора, которые API-интерфейс автоматически сопоставляет с каждым результирующим набором.

  3. Выполнить одну или несколько инструкций Transact-SQL.

  4. Произвести выборку строк в результирующие наборы.

Если атрибуты или свойства курсора API имеют значения по умолчанию, поставщик OLE DB для собственного клиента SQL Server и драйвер ODBC для собственного клиента SQL Server используют результирующие наборы по умолчанию. Хотя API-интерфейс технически запрашивает курсор, характеристики курсора по умолчанию соответствуют поведению результирующего набора по умолчанию. Поэтому поставщик OLE DB и драйвер ODBC реализуют параметры курсора по умолчанию, используя результирующие наборы по умолчанию, поскольку это наиболее эффективный способ получения строк из сервера. При использовании результирующих наборов по умолчанию приложение может выполнить любую инструкцию или пакет инструкций Transact-SQL, но при этом может иметь только одну необработанную инструкцию для соединения. Это значит, что приложение должно обработать все результирующие наборы, возвращенные одной инструкцией, или отменить их обработку, прежде чем приступить к выполнению другой инструкции для данного соединения.

Если атрибуты или свойства курсора API имеют значения, отличные от значений по умолчанию, поставщик OLE DB для собственного клиента SQL Server и драйвер ODBC для собственного клиента SQL Server используют серверные курсоры API, а не результирующие наборы по умолчанию. При каждом вызове функции API для выборки строк формируется обращение к серверу для выборки строк из серверного курсора API.

Ограничения серверного курсора API

При использовании серверных курсоров API приложение не может выполнять следующие инструкции:

  • инструкции Transact-SQL, которые SQL Server не поддерживает в серверных курсорах;

  • пакеты или хранимые процедуры, которые возвращают несколько результирующих наборов;

  • инструкции SELECT, которые содержат предложения COMPUTE, COMPUTE BY, FOR BROWSE или INTO;

  • инструкцию EXECUTE, которая содержит ссылку на удаленную хранимую процедуру.

Реализация серверного курсора API

Поставщик OLE DB для собственного клиента SQL Server и драйвер ODBC для собственного клиента SQL Server оповещает сервер об операциях с курсором при помощи следующих специальных системных хранимых процедур:

  • процедура sp_cursoropen определяет инструкцию SQL, которая будет назначена курсору и параметрам курсора, а затем производит заполнение курсора;

  • процедура sp_cursorfetch выполняет выборку из курсора строки или группы строк;

  • процедура sp_cursorclose закрывает курсор и освобождает его ресурсы;

  • процедура sp_cursoroption задает различные параметры курсора;

  • процедура sp_cursor служит для запроса о выполнении нацеленных обновлений;

  • процедура sp_cursorprepare компилирует план выполнения из инструкции или пакета инструкций Transact-SQL, связанных с курсором, но не создает курсор;

  • процедура sp_cursorexecute создает и заполняет курсор в соответствии с планом выполнения, который был создан процедурой sp_cursorprepare;

  • процедура sp_cursorunprepare удаляет план выполнения из sp_cursorprepare;

  • процедура sp_cursorprepexec компилирует план для указанной инструкции или пакета Transact-SQL, связанных с курсором, создает курсор и производит его заполнение; процедура sp_cursorprepexec сочетает в себе функции процедур sp_cursorprepare и sp_cursorexecute.

Эти системные хранимые процедуры отображаются приложением SQL Server Profiler в трассировках приложений ADO, OLE DB и ODBC, использующих серверные курсоры API. Они предназначены только для внутреннего использования поставщиком OLE DB для собственного клиента SQL Server и драйвером ODBC для собственного клиента SQL Server. Весь объем функциональных возможностей этих процедур доступен приложениям при использовании функций курсоров API-интерфейсов баз данных. Указание процедур непосредственно в приложениях не поддерживается.

Когда SQL Server выполняет инструкцию соединения, другие инструкции для этого соединения не могут быть выполнены до тех пор, пока не будут обработаны или отменены все результаты первой инструкции. Это правило распространяется и на использование серверных курсоров API, однако для приложения это выглядит так, будто SQL Server начал поддерживать несколько активных инструкций для одного соединения. Это происходит потому, что полный результирующий набор хранится в серверном курсоре, а в SQL Server передаются лишь инструкции, выполняющие системные хранимые процедуры sp_cursor. SQL Server выполняет эту хранимую процедуру и, как только клиент получает результирующий набор, может выполнить любую другую инструкцию. Перед передачей управления приложению поставщик OLE DB и драйвер ODBC всегда получают все результаты хранимой процедуры sp_cursor. Это позволяет приложениям обмениваться выборками между несколькими активными серверными курсорами.

В следующей таблице показано, как приложение может одновременно обрабатывать два курсора в одном соединении при помощи двух дескрипторов инструкции.

Дескриптор инструкции 1

Дескриптор инструкции 2

Установите атрибуты курсора таким образом, чтобы использовался серверный курсор API.

Примените функцию SQLExecDirect к инструкции SQL. Драйвер ODBC вызывает процедуру sp_cursoropen и получает результирующий набор, возвращенный процедурой.

Установите атрибуты курсора таким образом, чтобы использовался серверный курсор API.

Примените функцию SQLExecDirect к инструкции SQL. Драйвер ODBC вызывает процедуру sp_cursoropen и получает результирующий набор, возвращенный процедурой.

Примените функцию SQLFetchScroll, чтобы получить первую группу строк. Драйвер вызывает процедуру sp_cursorfetch, а затем получает результирующий набор, возвращенный процедурой.

Примените функцию SQLFetchScroll, чтобы получить первую группу строк. Драйвер вызывает процедуру sp_cursorfetch, а затем получает результирующий набор, возвращенный процедурой.

Примените функцию SQLFetchScroll, чтобы получить следующую группу строк. Драйвер вызывает процедуру sp_cursorfetch, а затем получает результирующий набор, возвращенный процедурой.

Примените функцию SQLFetchScroll, чтобы получить следующую группу строк. Драйвер вызывает процедуру sp_cursorfetch, а затем получает результирующий набор, возвращенный процедурой.

Вызовите функцию SQLFreeStmt или SQLCloseCursor. Драйвер вызывает процедуру sp_cursorclose.

Вызовите функцию SQLFreeStmt или SQLCloseCursor. Драйвер вызывает процедуру sp_cursorclose.

Поскольку после любого вызова хранимой процедуры sp_cursor необработанных результатов для соединения не остается, несколько инструкций Transact-SQL могут быть выполнены одновременно для одного соединения при условии, что они все выполняются серверными курсорами API.

Указание серверных курсоров API

Сводка использования в API-интерфейсах серверных курсоров API:

  • Интерфейс OLE DB

    • Откройте объект сеанса, откройте объект команды, укажите текст команды.

    • Задайте свойства набора строк для управления работой курсора, например DBPROP_OTHERINSERT, DBPROP_OTHERUPDATEDELETE, DBPROP_OWNINSERT, DBPROP_OWNUDPATEDELETE.

    • Выполните объект команды.

    • Отправьте строки в результирующий набор при помощи методов IRowset::GetNextRows, IRowsetLocate::GetRowsAt, IRowsetLocate::GetRowsAtBookmark и IRowsetScroll::GetRowsAtRatio.

  • Интерфейс ODBC

    • Установите соединение и вызовите функцию SQLAllocHandle, чтобы назначить дескрипторы инструкций.

    • Вызовите функцию SQLSetStmtAttr, чтобы задать атрибуты SQL_ATTR_CURSOR_TYPE, SQL_ATTR_CONCURRENCY и SQL_ATTR_ROW_ARRAY_SIZE. Поведение курсора можно также указать, задав атрибуты SQL_ATTR_CURSOR_SCROLLABLE и SQL_ATTR_CURSOR_SENSITIVITY.

    • Выполните инструкцию Transact-SQL с помощью функций SQLExecDirect или SQLPrepare и SQLExecute.

    • Выполните выборку строк или группы строк с помощью функции SQLFetch или SQLFetchScroll.

  • Интерфейс ADO

    • Определите объект Connection и объект Recordset, а затем выполните метод Open для объекта Connection.

    • Выполните метод Open для объекта Recordset, указав параметры CursorType или LockType.

    • Выполните выборку строк при помощи методов набора записей Move, MoveFirst, MoveLast, MoveNext и MovePrevious.

Серверные курсоры API и параметры SET

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

Параметры, влияющие на план выполнения

ARITHABORT

NUMERIC_ROUNDABORT

FORCEPLAN

QUOTED_IDENTIFIER

ANSI_NULL_DFLT_ON

ANSI_WARNINGS

ANSI_PADDING

ANSI_NULLS

CONCAT_NULL_YIELDS_NULL

DATEFIRST

DATEFORMAT

LANGUAGE

TEXTSIZE

Индексированные представления и вычисляемые столбцы

ANSI_NULLS

ANSI_PADDING

ANSI_WARNINGS

ARITHABORT (при уровне совместимости 80 или ниже) CONCAT_NULL_YIELDS_NULL

QUOTED_IDENTIFIER

NUMERIC_ROUNDABORT