Конструирование инструкций SQL для курсоров

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

Атрибут

По умолчанию

SQL_ATTR_CONCURRENCY

SQL_CONCUR_READ_ONLY

SQL_ATTR_CURSOR_TYPE

SQL_CURSOR_FORWARD_ONLY

SQL_ATTR_CURSOR_SCROLLABLE

SQL_NONSCROLLABLE

SQL_ATTR_CURSOR_SENSITIVITY

SQL_UNSPECIFIED

SQL_ATTR_ROW_ARRAY_SIZE

1

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

Результирующие наборы по умолчанию поддерживают все инструкции Transact-SQL. Ограничения на типы инструкций SQL, которые можно выполнять при использовании результирующего набора по умолчанию, отсутствуют.

Серверные курсоры поддерживают не все инструкции Transact-SQL. Серверные курсоры не поддерживают любые инструкции SQL, формирующие множественные результирующие наборы.

Следующие типы инструкций не поддерживаются серверными курсорами.

  • Пакеты

    Инструкции SQL, состоящие из двух и более отдельных инструкций SQL SELECT, например:

    SELECT * FROM Authors; SELECT * FROM Titles
    
  • Хранимые процедуры с несколькими инструкциями SELECT

    Инструкции SQL, которые выполняют хранимую процедуру, содержащую более одной инструкции SELECT. К ним относятся инструкции SELECT, которые заполняют параметры или переменные.

  • Ключевые слова

    Инструкции SQL, которые содержат ключевые слова FOR BROWSE или INTO.

В SQL Server: если инструкция SQL, соответствующая любому из этих условий, выполняется с серверным курсором, то серверный курсор неявно преобразуется в результирующий набор по умолчанию. После того как функция SQLExecDirect или SQLExecute возвращает SQL_SUCCESS_WITH_INFO, атрибутам курсора присваиваются их значения по умолчанию.

Инструкции SQL, не относящиеся к перечисленным выше категориям, могут выполняться с любыми настройками атрибутов инструкций; они работают одинаково успешно с результирующим набором по умолчанию и с серверным курсором.

Ошибки

В SQL Server 7.0 и более поздних версиях попытка выполнить инструкцию, возвращающую несколько результирующих наборов, формирует SQL_SUCCESS_WITH_INFO и следующее сообщение:

SqlState: 01S02"
pfNative: 0
szErrorMsgString: "[Microsoft][SQL Server Native Client][SQL Server]
               Cursor type changed."

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

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

SqlState: 42000
pfNative: 16937
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
               A server cursor is not allowed on a stored procedure
               with more than one SELECT statement in it. Use a
               default result set or client cursor.

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

SqlState: 42000
pfNative: 16938
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
               sp_cursoropen. The statement parameter can only
               be a single SELECT statement or a single stored 
               procedure.

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

См. также

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

Выполнение запросов (ODBC)