Partilhar via


Construindo instruções SQL para cursores

O driver ODBC do SQL Server Native Client usa cursores de servidor para implementar a funcionalidade de cursor definida na especificação de ODBC. Um aplicativo ODBC controla o comportamento de cursor usando SQLSetStmtAttr para definir atributos de instrução diferentes. Estes são os atributos e seus padrões.

Atributo

Padrão

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

Quando essas opções estão definidas como o padrão no momento em que uma instrução SQL é executada, o driver ODBC do SQL Server Native Client não usa um cursor de servidor para implementar o conjunto de resultados; na verdade, ele usa um conjunto de resultados padrão. Caso alguma dessas opções seja alterada em relação ao padrão no momento em que uma instrução SQL é executada, o driver ODBC do SQL Server Native Client tenta usar um cursor de servidor para implementar o conjunto de resultados.

Conjuntos de resultados padrão oferecem suporte a todas as instruções Transact-SQL. Não há nenhuma restrição quanto aos tipos de instruções SQL que podem ser executados ao usar um conjunto de resultados padrão.

Os cursores de servidor não oferecem suporte a todas as instruções Transact-SQL. Os cursores de servidor não oferecem suporte a nenhuma instrução SQL que gera vários conjuntos de resultados.

Os seguintes tipos de instruções não oferecem suporte por meio de cursores de servidor:

  • Lotes

    Instruções SQL criadas a partir de duas ou mais instruções SQL SELECT individuais, por exemplo:

    SELECT * FROM Authors; SELECT * FROM Titles
    
  • Procedimentos armazenados com várias instruções SELECT

    As instruções SQL que executam um procedimento armazenado contendo mais de uma instrução SELECT. Isso inclui instruções SELECT que preenchem parâmetros ou variáveis.

  • Palavras-chave

    Instruções SQL que contêm as palavras-chave FOR BROWSE ou INTO.

No SQL Server, caso uma instrução SQL correspondente a alguma dessas condições seja executada com um cursor de servidor, este é implicitamente convertido em um conjunto de resultados padrão. Depois que SQLExecDirect ou SQLExecute retornar SQL_SUCCESS_WITH_INFO, os atributos do cursor serão definidos novamente como as configurações padrão.

As instruções SQL que não se enquadram nas categorias acima podem ser executadas com qualquer configuração de atributo da instrução; elas funcionam igualmente bem com um conjunto de resultados padrão ou um cursor de servidor.

Erros

No SQL Server 7.0 e posterior, uma tentativa de executar uma instrução que produz vários conjuntos de resultados gera SQL_SUCCESS_WITH INFO, além da seguinte mensagem:

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

Aplicativos ODBC que recebem essa mensagem podem chamar SQLGetStmtAttr para determinar as configurações de cursor atuais.

Uma tentativa de executar um procedimento com várias instruções SELECT durante o uso de cursores de servidor gera o seguinte erro:

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.

Uma tentativa de executar um lote com várias instruções SELECT durante o uso de cursores de servidor gera o seguinte erro:

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.

Aplicativos ODBC que recebem esses erros devem restaurar todos padrões dos atributos de instrução de cursor antes de tentar executá-la.

Consulte também

Conceitos

Executando consultas (ODBC)