Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Base de Dados SQL do Azure
Instância Gerida do Azure SQL
Azure Synapse Analytics
O driver ODBC do SQL Server Native Client utiliza cursores de servidor para implementar a funcionalidade de cursor definida na especificação ODBC. Uma aplicação ODBC controla o comportamento do cursor usando SQLSetStmtAttr para definir diferentes atributos de instruções. Estes são os atributos e os seus valores padrão.
| Attribute | Default |
|---|---|
| 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 estas opções são definidas para os seus valores predefinidos no momento em que uma instrução SQL é executada, o driver ODBC do SQL Server Native Client não utiliza um cursor de servidor para implementar o conjunto de resultados; em vez disso, utiliza um conjunto de resultados predefinido. Se alguma destas opções for alterada em relação aos seus valores definidos 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.
Os conjuntos de resultados padrão suportam todas as instruções Transact-SQL. Não existem restrições quanto aos tipos de instruções SQL que podem ser executadas ao usar um conjunto de resultados predefinido.
Os cursores do servidor não suportam todas as instruções Transact-SQL. Os cursores do servidor não suportam nenhuma instrução SQL que gere múltiplos conjuntos de resultados.
Os seguintes tipos de instruções não são suportados por cursores de servidor:
Batches
Instruções SQL construídas a partir de duas ou mais instruções SQL SELECT individuais, por exemplo:
SELECT * FROM Authors; SELECT * FROM TitlesProcedimentos armazenados com múltiplas instruções SELECT
Instruções SQL que executam um procedimento armazenado contendo mais do que uma instrução SELECT. Isto 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, se uma instrução SQL que corresponde a alguma destas condições for executada com um cursor de servidor, o cursor de servidor é implicitamente convertido para um conjunto de resultados predefinido. Depois de o SQLExecDirect ou SQLExecute devolver SQL_SUCCESS_WITH_INFO, os atributos do cursor voltam às suas definições predefinidas.
Instruções SQL que não se enquadram nas categorias acima podem ser executadas com quaisquer definições de atributo de instrução; Funcionam igualmente bem com um conjunto de resultados padrão ou com um cursor de servidor.
Errors
Em SQL Server 7.0 e posteriores, uma tentativa de executar uma instrução que produz múltiplos conjuntos de resultados gera SQL_SUCCESS_WITH INFO e a seguinte mensagem:
SqlState: 01S02"
pfNative: 0
szErrorMsgString: "[Microsoft][SQL Server Native Client][SQL Server]
Cursor type changed."
As aplicações ODBC que recebem esta mensagem podem chamar SQLGetStmtAttr para determinar as definições atuais do cursor.
Uma tentativa de executar um procedimento com múltiplas instruções SELECT ao usar 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 múltiplas instruções SELECT ao usar 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.
As aplicações ODBC que recebem estes erros devem repor todos os atributos da instrução cursor para os seus valores definidos antes de tentarem executar a instrução.