Costruzione di istruzioni SQL per i cursori

Si applica a: sìSQL Server (tutte le versioni supportate) Sìdatabase SQL di Azure SìIstanza gestita di SQL di Azure sìAzure Synapse Analytics sìParallel Data Warehouse

Il SQL Server driver ODBC di Native Client usa i cursori server per implementare la funzionalità del cursore definita nella specifica ODBC. Un'applicazione ODBC controlla il comportamento del cursore usando SQLSetStmtAttr per impostare attributi di istruzione diversi. Di seguito sono indicati gli attributi e le rispettive impostazioni predefinite.

Attributo Predefinito
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 queste opzioni sono impostate sui valori predefiniti al momento dell'esecuzione di un'istruzione SQL, il driver ODBC di Native Client non usa un cursore server per implementare il set di risultati, ma usa un set di risultati SQL Server predefinito. Se una di queste opzioni viene modificata rispetto alle impostazioni predefinite al momento dell'esecuzione di un'istruzione SQL, il driver ODBC di Native Client tenta di usare un cursore server per implementare il SQL Server set di risultati.

I set di risultati predefiniti supportano tutte le istruzioni Transact-SQL. Non sono presenti restrizioni sui tipi di istruzioni SQL che è possibile eseguire quando si utilizza un set di risultati predefinito.

I cursori server non supportano tutte le istruzioni Transact-SQL e non supportano un'istruzione SQL che genera più set di risultati.

Di seguito sono indicati i tipi di istruzioni non supportati dai cursori server:

  • Batch

    Istruzioni SQL compilate da due o più istruzioni SQL SELECT singole, ad esempio:

    SELECT * FROM Authors; SELECT * FROM Titles  
    
  • Stored procedure con più istruzioni SELECT

    Istruzioni SQL che eseguono una stored procedure che contiene più di un'istruzione SELECT. Sono incluse le istruzioni SELECT che vengono inserite in parametri o variabili.

  • Parole chiave

    Istruzioni SQL contenenti le parole chiave FOR BROWSE o INTO.

Se in SQL Server un'istruzione SQL che corrisponde a una di queste condizioni viene eseguita con un cursore server, il cursore server viene convertito implicitamente in un set di risultati predefinito. Dopo che SQLExecDirect o SQLExecute SQL_SUCCESS_WITH_INFO, gli attributi del cursore verranno impostati nuovamente sulle impostazioni predefinite.

Le istruzioni SQL che non rientrano nelle categorie sopra riportate possono essere eseguite con qualsiasi impostazione degli attributi di istruzione. Il funzionamento è identico con un set di risultati predefinito o con un cursore server.

Errors

In SQL Server 7.0 e versioni successive un tentativo di eseguire un'istruzione che produce più set di risultati genera SQL_SUCCESS_WITH INFO e il messaggio seguente:

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

Le applicazioni ODBC che ricevono questo messaggio possono chiamare SQLGetStmtAttr per determinare le impostazioni correnti del cursore.

Un tentativo di eseguire una procedura con più istruzioni SELECT quando si utilizzano cursori server genera l'errore seguente:

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.  

Un tentativo di eseguire un batch con più istruzioni SELECT quando l'utilizzo di cursori server genera l'errore seguente:

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.  

Nelle applicazioni ODBC che ricevono questi errori devono essere reimpostati tutti gli attributi di istruzione di cursore sui valori predefiniti prima di tentare di eseguire l'istruzione.

Vedere anche

Esecuzione di query (odbc)