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


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

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

Драйвер 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)