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

Применимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data WarehouseПрименимо к:Applies to: даSQL ServerSQL Server (все поддерживаемые версии) yesSQL ServerSQL Server (all supported versions) ДаБаза данных SQL AzureAzure SQL DatabaseYesБаза данных SQL AzureAzure SQL Database ДаУправляемый экземпляр SQL AzureAzure SQL Managed InstanceYesУправляемый экземпляр SQL AzureAzure SQL Managed Instance даAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics даПараллельное хранилище данныхParallel Data WarehouseyesПараллельное хранилище данныхParallel Data Warehouse

SQL ServerSQL ServerДрайвер ODBC для собственного клиента использует серверные курсоры для реализации функции курсора, определенной в спецификации ODBC.The SQL ServerSQL Server Native Client ODBC driver uses server cursors to implement the cursor functionality defined in the ODBC specification. Приложение ODBC управляет поведением курсора с помощью SQLSetStmtAttr для установки различных атрибутов операторов.An ODBC application controls the cursor behavior by using SQLSetStmtAttr to set different statement attributes. К ним относятся атрибуты и их значения по умолчанию.These are the attributes and their defaults.

attributeAttribute По умолчаниюDefault
SQL_ATTR_CONCURRENCYSQL_ATTR_CONCURRENCY SQL_CONCUR_READ_ONLYSQL_CONCUR_READ_ONLY
SQL_ATTR_CURSOR_TYPESQL_ATTR_CURSOR_TYPE SQL_CURSOR_FORWARD_ONLYSQL_CURSOR_FORWARD_ONLY
SQL_ATTR_CURSOR_SCROLLABLESQL_ATTR_CURSOR_SCROLLABLE SQL_NONSCROLLABLESQL_NONSCROLLABLE
SQL_ATTR_CURSOR_SENSITIVITYSQL_ATTR_CURSOR_SENSITIVITY SQL_UNSPECIFIEDSQL_UNSPECIFIED
SQL_ATTR_ROW_ARRAY_SIZESQL_ATTR_ROW_ARRAY_SIZE 11

Если для этих параметров заданы значения по умолчанию во время выполнения инструкции SQL, SQL ServerSQL Server драйвер ODBC для собственного клиента не использует серверный курсор для реализации результирующего набора; вместо этого он использует результирующий набор по умолчанию.When these options are set to their defaults at the time an SQL statement is executed, the SQL ServerSQL Server Native Client ODBC driver does not use a server cursor to implement the result set; instead, it uses a default result set. Если какой-либо из этих параметров изменяется со значений по умолчанию во время выполнения инструкции SQL, SQL ServerSQL Server драйвер ODBC для собственного клиента пытается использовать серверный курсор для реализации результирующего набора.If any of these options are changed from their defaults at the time an SQL statement is executed, the SQL ServerSQL Server Native Client ODBC driver attempts to use a server cursor to implement the result set.

Результирующие наборы по умолчанию поддерживают все инструкции Transact-SQLTransact-SQL.Default result sets support all of the Transact-SQLTransact-SQL statements. Ограничения на типы инструкций SQL, которые можно выполнять при использовании результирующего набора по умолчанию, отсутствуют.There are no restrictions on the types of SQL statements that can be executed when using a default result set.

Серверные курсоры поддерживают не все инструкции Transact-SQLTransact-SQL.Server cursors do not support all Transact-SQLTransact-SQL statements. Серверные курсоры не поддерживают любые инструкции SQL, формирующие множественные результирующие наборы.Server cursors do not support any SQL statement that generates multiple result sets.

Следующие типы инструкций не поддерживаются серверными курсорами.The following types of statements are not supported by server cursors:

  • ПакетыBatches

    Инструкции SQL, состоящие из двух и более отдельных инструкций SQL SELECT, например:SQL statements built from two or more individual SQL SELECT statements, for example:

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

    Инструкции SQL, которые выполняют хранимую процедуру, содержащую более одной инструкции SELECT.SQL statements that execute a stored procedure containing more than one SELECT statement. К ним относятся инструкции SELECT, которые заполняют параметры или переменные.This includes SELECT statements that fill parameters or variables.

  • KeywordsKeywords

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

В SQL ServerSQL Server: если инструкция SQL, соответствующая любому из этих условий, выполняется с серверным курсором, то серверный курсор неявно преобразуется в результирующий набор по умолчанию.In SQL ServerSQL Server, if an SQL statement that matches any of these conditions is executed with a server cursor, the server cursor is implicitly converted to a default result set. После того как SQLExecDirect или SQLExecute возвращает SQL_SUCCESS_WITH_INFO, для атрибутов курсора будут заданы значения по умолчанию.After SQLExecDirect or SQLExecute returns SQL_SUCCESS_WITH_INFO, the cursor attributes will be set back to their default settings.

Инструкции SQL, не относящиеся к перечисленным выше категориям, могут выполняться с любыми настройками атрибутов инструкций; они работают одинаково успешно с результирующим набором по умолчанию и с серверным курсором.SQL statements that do not fit the categories above can be executed with any statement attribute settings; they work equally well with either a default result set or a server cursor.

ошибкиErrors

В SQL ServerSQL Server 7.0 и более поздних версиях попытка выполнить инструкцию, возвращающую несколько результирующих наборов, формирует SQL_SUCCESS_WITH_INFO и следующее сообщение:In SQL ServerSQL Server 7.0 and later, an attempt to execute a statement that produces multiple result sets generates SQL_SUCCESS_WITH INFO and the following message:

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

Приложения ODBC, получающие это сообщение, могут вызывать SQLGetStmtAttr для определения текущих параметров курсора.ODBC applications receiving this message can call SQLGetStmtAttr to determine the current cursor settings.

При попытке выполнить процедуру с несколькими инструкциями SELECT с использованием серверных курсоров формируется следующая ошибка:An attempt to execute a procedure with multiple SELECT statements when using server cursors generates the following error:

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 с использованием серверных курсоров формируется следующая ошибка:An attempt to execute a batch with multiple SELECT statements when using server cursors generates the following error:

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 applications receiving these errors must reset all the cursor statement attributes to their defaults before attempting to execute the statement.

См. такжеSee Also

Выполняя запросы (ODBC)Executing Queries (ODBC)