Поделиться через


Конструирование инструкций 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, которые содержат ключевые слова COMPUTE, COMPUTE BY, FOR BROWSE или INTO;

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

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

Ошибки

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

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

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

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

SqlState: 42000pfNative: 16937szErrorMsgString: [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: 42000pfNative: 16938szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]               sp_cursoropen. The statement parameter can only               be a single SELECT statement or a single stored                procedure.

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

SqlState: 42000pfNative: 16907szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]               'COMPUTE' is not allowed in cursor statements.

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

См. также

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