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 COMPUTE, COMPUTE BY, 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.
Uma tentativa de executar uma instrução SELECT que contém uma cláusula COMPUTE durante o uso de cursores de servidor gera o seguinte erro:
SqlState: 42000
pfNative: 16907
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
'COMPUTE' is not allowed in cursor statements.
Aplicativos ODBC que recebem esses erros devem restaurar todos padrões dos atributos de instrução de cursor antes de tentar executá-la.