CursoriCursors

Nei database relazionali le operazioni vengono eseguite su set di righe completi.Operations in a relational database act on a complete set of rows. Ad esempio, il set di righe restituito dall'istruzione SELECT include tutte le righe che soddisfano le condizioni specificate nella clausola WHERE dell'istruzione.For example, the set of rows returned by a SELECT statement consists of all the rows that satisfy the conditions in the WHERE clause of the statement. Il set di righe completo restituito dall'istruzione è noto come set di risultati.This complete set of rows returned by the statement is known as the result set. Le applicazioni, soprattutto le applicazioni online interattive, non sono sempre in grado di gestire in modo efficiente un intero set di risultati come singola unità.Applications, especially interactive online applications, cannot always work effectively with the entire result set as a unit. In tali applicazioni deve essere pertanto disponibile un meccanismo per l'elaborazione di una riga singola o di un blocco di righe di dimensioni ridotte.These applications need a mechanism to work with one row or a small block of rows at a time. I cursori sono un'estensione dei set di risultati che implementano appunto tale meccanismo.Cursors are an extension to result sets that provide that mechanism.

I cursori estendono l'elaborazione dei risultati nel modo seguente:Cursors extend result processing by:

  • Consentono il posizionamento su righe specifiche del set di risultati.Allowing positioning at specific rows of the result set.

  • Recuperano una riga o un blocco di righe dalla posizione corrente del set di risultati.Retrieving one row or block of rows from the current position in the result set.

  • Supportano la modifica dei dati delle righe in corrispondenza della posizione corrente del set di risultati.Supporting data modifications to the rows at the current position in the result set.

  • Supportano livelli diversi di visibilità per le modifiche apportate da altri utenti ai dati del database inclusi nel set di risultati.Supporting different levels of visibility to changes made by other users to the database data that is presented in the result set.

  • Consentono alle istruzioni Transact-SQLTransact-SQL incluse in script, stored procedure e trigger di accedere ai dati di un set di risultati.Providing Transact-SQLTransact-SQL statements in scripts, stored procedures, and triggers access to the data in a result set.

ConcettiConcepts

Implementazione dei cursoriCursor Implementations
SQL ServerSQL Server supporta l'implementazione di tre tipi di cursori. SQL ServerSQL Server supports three cursor implementations.

cursori Transact-SQLTransact-SQL cursors
Sono basati sulla sintassi DECLARE CURSOR e sono principalmente usati in trigger, stored procedure e script Transact-SQLTransact-SQL .Are based on the DECLARE CURSOR syntax and are used mainly in Transact-SQLTransact-SQL scripts, stored procedures, and triggers. Transact-SQLTransact-SQL vengono implementati nel server e gestiti dalle istruzioni Transact-SQLTransact-SQL inviate dal client al server. statements sent from the client to the server. Possono essere inoltre inclusi in batch, stored procedure o trigger.They may also be contained in batches, stored procedures, or triggers.

Cursori API (Application Programming Interface) del serverApplication programming interface (API) server cursors
Supportano le funzioni dei cursori API in OLE DB e ODBC.Support the API cursor functions in OLE DB and ODBC. Questi cursori sono implementati nel server.API server cursors are implemented on the server. Ogni volta che un'applicazione client chiama una funzione per un cursore API, il provider OLE DB o il driver ODBC di Native Client SQL ServerSQL Server trasmette al server la richiesta di eseguire un'azione sul cursore API del server.Each time a client application calls an API cursor function, the SQL ServerSQL Server Native Client OLE DB provider or ODBC driver transmits the request to the server for action against the API server cursor.

Cursori clientClient cursors
Sono implementati internamente dal driver ODBC di Native Client SQL ServerSQL Server e dalla DLL che implementa l'API ADO.Are implemented internally by the SQL ServerSQL Server Native Client ODBC driver and by the DLL that implements the ADO API. I cursori client vengono implementati mediante la memorizzazione nella cache del client di tutte le righe del set di risultati.Client cursors are implemented by caching all the result set rows on the client. Ogni volta che un'applicazione client chiama una funzione per un cursore API, la DLL ADO o il driver ODBC di Native Client SQL ServerSQL Server esegue l'operazione del cursore nelle righe del set di risultati memorizzate nella cache del client.Each time a client application calls an API cursor function, the SQL ServerSQL Server Native Client ODBC driver or the ADO DLL performs the cursor operation on the result set rows cached on the client.

Tipo di cursoriType of Cursors
Forward-onlyForward-only
I cursori forward-only non supportano lo scorrimento, ma solo le operazioni di recupero seriale delle righe dall'inizio alla fine del cursore.A forward-only cursor does not support scrolling; it supports only fetching the rows serially from the start to the end of the cursor. Le righe vengono prelevate dal database solo quando si esegue l'operazione di recupero.The rows are not retrieved from the database until they are fetched. Gli effetti delle istruzioni INSERT, UPDATE e DELETE eseguite dall'utente corrente o da altri utenti che coinvolgono le righe del set di risultati sono visibili nel momento in cui le righe vengono recuperate dal cursore.The effects of all INSERT, UPDATE, and DELETE statements made by the current user or committed by other users that affect rows in the result set are visible as the rows are fetched from the cursor.

Poiché non è supportato lo scorrimento a ritroso del cursore, la maggior parte delle modifiche apportate alle righe nel database in seguito al recupero non sono visibili tramite il cursore.Because the cursor cannot be scrolled backward, most changes made to rows in the database after the row was fetched are not visible through the cursor. Nei casi in cui un valore usato per determinare la posizione della riga all'interno del set di risultati viene modificato, ad esempio tramite l'aggiornamento di una colonna coperta da un indice cluster, il valore modificato sarà visibile tramite il cursore.In cases where a value used to determine the location of the row within the result set is modified, such as updating a column covered by a clustered index, the modified value is visible through the cursor.

Anche se i modelli di cursore API del database considerano un cursore forward-only un tipo distinto di cursore, SQL ServerSQL Server non fa questa distinzione.Although the database API cursor models consider a forward-only cursor to be a distinct type of cursor, SQL ServerSQL Server does not. SQL ServerSQL Server considera il forward-only e lo scorrimento come opzioni da applicare ai cursori statici, gestiti da keyset e dinamici. considers both forward-only and scroll as options that can be applied to static, keyset-driven, and dynamic cursors. Transact-SQLTransact-SQL supportano i cursori dinamici, i cursori gestiti da keyset e i cursori statici forward-only. cursors support forward-only static, keyset-driven, and dynamic cursors. In base ai modelli di cursore dell'API di database i cursori dinamici, gestiti da keyset o statici sono sempre scorrevoli.The database API cursor models assume that static, keyset-driven, and dynamic cursors are always scrollable. I cursori API del database con una proprietà o un attributo impostato su forward-only vengono implementati in SQL ServerSQL Server come cursori forward-only dinamici.When a database API cursor attribute or property is set to forward-only, SQL ServerSQL Server implements this as a forward-only dynamic cursor.

StaticoStatic
Il set di risultati completo di un cursore statico viene compilato nel database tempdb all'apertura del cursore.The complete result set of a static cursor is built in tempdb when the cursor is opened. Un cursore statico visualizza sempre il set di risultati così come è visualizzato all'apertura del cursore.A static cursor always displays the result set as it was when the cursor was opened. I cursori statici rilevano poche modifiche o addirittura nessuna, ma utilizzano un numero relativamente ridotto di risorse per lo scorrimento.Static cursors detect few or no changes, but consume relatively few resources while scrolling.

Nel cursore non vengono riportate né le modifiche al database che hanno effetto sull'appartenenza del set di risultati, né le modifiche apportate ai valori inclusi nelle colonne delle righe del set di risultati.The cursor does not reflect any changes made in the database that affect either the membership of the result set or changes to the values in the columns of the rows that make up the result set. Un cursore statico non visualizza le nuove righe inserite nel database dopo l'apertura del cursore, anche se tali righe soddisfano le condizioni di ricerca dell'istruzione SELECT del cursore.A static cursor does not display new rows inserted in the database after the cursor was opened, even if they match the search conditions of the cursor SELECT statement. Non visualizza inoltre gli aggiornamenti eseguiti da altri utenti nelle righe del set di risultati.If rows making up the result set are updated by other users, the new data values are not displayed in the static cursor. Un cursore statico riflette invece le operazioni di eliminazione di righe dal database dopo l'apertura del cursore.The static cursor displays rows deleted from the database after the cursor was opened. Il risultato delle operazioni UPDATE, INSERT e DELETE non viene mai riportato nel cursore statico, né le modifiche eseguite sulla stessa connessione in cui è stato aperto il cursore (a meno che il cursore non venga chiuso e riaperto).No UPDATE, INSERT, or DELETE operations are reflected in a static cursor (unless the cursor is closed and reopened), not even modifications made using the same connection that opened the cursor.

SQL ServerSQL Server sono sempre di sola lettura. static cursors are always read-only.

Poiché il set di risultati di un cursore statico viene archiviato in una tabella di lavoro in tempdb, la lunghezza delle righe non può essere maggiore della lunghezza di riga massima consentita per le tabelle di SQL ServerSQL Server .Because the result set of a static cursor is stored in a work table in tempdb, the size of the rows in the result set cannot exceed the maximum row size for a SQL ServerSQL Server table.

Transact-SQLTransact-SQL definisce i cursori statici come cursori di tipo insensitive. uses the term insensitive for static cursors. Alcune API di database li identificano come cursori snapshot.Some database APIs identify them as snapshot cursors.

KeysetKeyset
L'appartenenza e l'ordine delle righe di un cursore gestito da keyset vengono fissati al momento dell'apertura del cursore.The membership and order of rows in a keyset-driven cursor are fixed when the cursor is opened. I cursori gestiti da keyset vengono controllati da un set di identificatori univoci, ovvero chiavi, noti come keyset.Keyset-driven cursors are controlled by a set of unique identifiers, keys, known as the keyset. Le chiavi sono costituite da un set di colonne che identificano in modo univoco le righe del set di risultati.The keys are built from a set of columns that uniquely identify the rows in the result set. Il keyset corrisponde al set di valori chiave di tutte le righe risultanti dall'istruzione SELECT al momento dell'apertura del cursore.The keyset is the set of the key values from all the rows that qualified for the SELECT statement at the time the cursor was opened. Il keyset di un cursore gestito da keyset viene compilato nel database tempdb all'apertura del cursore.The keyset for a keyset-driven cursor is built in tempdb when the cursor is opened.

DynamicDynamic
I cursori dinamici sono l'opposto dei cursori statici.Dynamic cursors are the opposite of static cursors. Quando si scorre un cursore dinamico vengono visualizzate tutte le modifiche apportate alle righe del set di risultati corrispondente.Dynamic cursors reflect all changes made to the rows in their result set when scrolling through the cursor. I valori di dati, l'ordine e l'appartenenza delle righe del set di risultati possono variare a ogni operazione di recupero.The data values, order, and membership of the rows in the result set can change on each fetch. I risultati delle istruzioni UPDATE, INSERT e DELETE eseguite da tutti gli utenti sono visibili nel cursore.All UPDATE, INSERT, and DELETE statements made by all users are visible through the cursor. Gli aggiornamenti sono visibili immediatamente se eseguiti nel cursore tramite una funzione API quale SQLSetPos o la clausola WHERE CURRENT OF Transact-SQLTransact-SQL .Updates are visible immediately if they are made through the cursor using either an API function such as SQLSetPos or the Transact-SQLTransact-SQL WHERE CURRENT OF clause. Gli aggiornamenti eseguiti all'esterno del cursore risultano visibili solo dopo l'operazione di commit, a meno che il livello di isolamento della transazione non sia impostato su read uncommitted.Updates made outside the cursor are not visible until they are committed, unless the cursor transaction isolation level is set to read uncommitted. I piani dinamici del cursore non usano mai indici spaziali.Dynamic cursor plans never use spatial indexes.

Richiesta di cursoriRequesting a Cursor

SQL ServerSQL Server supporta due metodi per richiedere un cursore: supports two methods for requesting a cursor:

  • Transact-SQLTransact-SQL

    Il linguaggio Transact-SQLTransact-SQL supporta una sintassi per l'utilizzo dei cursori creati in base alla sintassi del cursore ISO.The Transact-SQLTransact-SQL language supports a syntax for using cursors modeled after the ISO cursor syntax.

  • Funzioni per i cursori delle API di databaseDatabase application programming interface (API) cursor functions

    SQL ServerSQL Server supporta la funzionalità per i cursori delle API di database seguenti: supports the cursor functionality of these database APIs:

    • ADO ( MicrosoftMicrosoft ActiveX Data Object)ADO ( MicrosoftMicrosoft ActiveX Data Object)

    • OLE DBOLE DB

    • ODBC (Open Database Connectivity)ODBC (Open Database Connectivity)

    Questi due metodi non devono essere implementati entrambi nella stessa applicazione.An application should never mix these two methods of requesting a cursor. In un'applicazione in cui le funzionalità del cursore sono state implementate tramite le API, non è consentito richiedere un cursore Transact-SQLTransact-SQL tramite l'istruzione Transact-SQLTransact-SQL DECLARE CURSOR.An application that has used the API to specify cursor behaviors should not then execute a Transact-SQLTransact-SQL DECLARE CURSOR statement to also request a Transact-SQLTransact-SQL cursor. L'istruzione DECLARE CURSOR può essere eseguita solo dopo il ripristino di tutti i valori predefiniti degli attributi dei cursori API.An application should only execute DECLARE CURSOR if it has set all the API cursor attributes back to their defaults.

    Se non è stato richiesto né un cursore Transact-SQLTransact-SQL , né un cursore API, per impostazione predefinita SQL ServerSQL Server restituisce all'applicazione un set di risultati completo, ovvero un set di risultati predefinito.If neither a Transact-SQLTransact-SQL nor API cursor has been requested, SQL ServerSQL Server defaults to returning a complete result set, known as a default result set, to the application.

Processo del cursoreCursor Process

Transact-SQLTransact-SQL e i cursori API prevedono una sintassi diversa, ma per tutti i cursori di SQL ServerSQL Server viene usata la seguente procedura generale: cursors:

  1. Associare un cursore al set di risultati di un'istruzione Transact-SQLTransact-SQL e definirne le caratteristiche, ad esempio se le righe del cursore sono aggiornabili.Associate a cursor with the result set of a Transact-SQLTransact-SQL statement, and define characteristics of the cursor, such as whether the rows in the cursor can be updated.

  2. Eseguire l'istruzione Transact-SQLTransact-SQL per popolare il cursore.Execute the Transact-SQLTransact-SQL statement to populate the cursor.

  3. Recuperare le righe del cursore da visualizzare.Retrieve the rows in the cursor you want to see. L'operazione che consente di ottenere una riga o un blocco di righe da un cursore è definita operazione di recupero.The operation to retrieve one row or one block of rows from a cursor is called a fetch. L'esecuzione di una serie di operazioni di recupero in avanti o a ritroso è definita scorrimento.Performing a series of fetches to retrieve rows in either a forward or backward direction is called scrolling.

  4. Facoltativamente, eseguire operazioni di modifica (aggiornamento o eliminazione) sulla riga che si trova nella posizione corrente del cursore.Optionally, perform modification operations (update or delete) on the row at the current position in the cursor.

  5. Chiudere il cursore.Close the cursor.

Cursor Behaviors How Cursors Are ImplementedCursor Behaviors How Cursors Are Implemented

Vedere ancheSee Also

DECLARE CURSOR (Transact-SQL) DECLARE CURSOR (Transact-SQL)
Cursori (Transact-SQL) Cursors (Transact-SQL)
Funzioni per i cursori (Transact-SQL) Cursor Functions (Transact-SQL)
Stored procedure per cursori (Transact-SQL) Cursor Stored Procedures (Transact-SQL)