FETCH (Transact-SQL)

Recupera una riga specifica da un cursore Transact-SQL del server.

Sintassi

FETCH 
          [ [ NEXT | PRIOR | FIRST | LAST 
                    | ABSOLUTE { n | @nvar } 
                    | RELATIVE { n | @nvar } 
               ] 
               FROM 
          ] 
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name } 
[ INTO @variable_name [ ,...n ] ] 

Argomenti

  • NEXT
    Restituisce la riga del set di risultati successiva alla riga corrente e imposta la riga corrente sulla riga restituita. Se FETCH NEXT è la prima operazione di recupero eseguita con un cursore, viene restituita la prima riga del set di risultati. NEXT è l'opzione di recupero predefinita del cursore.
  • PRIOR
    Restituisce la riga del set di risultati precedente alla riga corrente e imposta la riga corrente sulla riga restituita. Se FETCH PRIOR è la prima operazione di recupero eseguita con un cursore, non viene restituita alcuna riga e il cursore rimane nella posizione che precede la prima riga.
  • FIRST
    Restituisce la prima riga nel cursore, che diventa la riga corrente.
  • LAST
    Restituisce l'ultima riga nel cursore, che diventa la riga corrente.
  • ABSOLUTE { n | **@**nvar}
    Se n o @nvar è un valore positivo, restituisce la riga corrispondente a n righe dall'inizio del cursore e imposta la riga restituita come nuova riga corrente. Se n o @nvar è un valore negativo, restituisce la riga corrispondente a n righe dalla fine del cursore e imposta la riga restituita come nuova riga corrente. Se n o @nvar è 0, non viene restituita alcuna riga. n deve essere una costante integer e @nvar deve essere di tipo smallint, tinyint o int.
  • RELATIVE { n | **@**nvar}
    Se n o @nvar è un valore positivo, restituisce la riga corrispondente a n righe successive alla riga corrente e imposta la riga restituita come nuova riga corrente. Se n o @nvar è un valore negativo, restituisce la riga corrispondente a n righe precedenti alla riga corrente e imposta la riga restituita come nuova riga corrente. Se n o @nvar è 0, restituisce la riga corrente. Se si specifica FETCH RELATIVE con l'argomento n o @nvar impostato su numeri negativi o su 0 per la prima operazione di recupero eseguita in un cursore, non viene restituita alcuna riga. n deve essere una costante integer e @nvar deve essere di tipo smallint, tinyint o int.
  • GLOBAL
    Specifica che l'argomento cursor_name fa riferimento a un cursore globale.
  • cursor_name
    Nome del cursore aperto dal quale deve essere eseguita l'operazione di recupero. Se esistono sia un cursore globale che un cursore locale denominati cursor_name, cursor_name indica il cursore globale se è stato specificato l'argomento GLOBAL oppure il cursore locale se GLOBAL è stato omesso.
  • @cursor_variable_name
    Nome di una variabile di cursore che fa riferimento al cursore da cui deve essere eseguita l'operazione di recupero.
  • INTO @variable_name[ ,...n]
    Consente di inserire in variabili locali i dati delle colonne ottenute da un'operazione di recupero. Ogni variabile dell'elenco, da sinistra a destra, è associata alla colonna corrispondente nel set di risultati del cursore. A ogni variabile deve essere associato lo stesso tipo di dati o un tipo di dati che supporti la conversione implicita dal tipo di dati della colonna corrispondente nel set di risultati. Il numero di variabili deve corrispondere al numero di colonne dell'elenco di selezione del cursore.

Osservazioni

Se nell'istruzione SQL-92 DECLARE CURSOR l'opzione SCROLL non è specificata, NEXT è l'unica opzione FETCH supportata. In caso contrario, sono supportate tutte le opzioni FETCH.

Quando vengono utilizzate le estensioni del cursore DECLARE di Transact-SQL, vengono applicate le regole seguenti:

  • Se è specificata l'opzione FORWARD-ONLY o FAST_FORWARD, NEXT è l'unica opzione FETCH supportata.
  • Se le opzioni DYNAMIC, FORWARD_ONLY o FAST_FORWARD sono state omesse ed è specificato KEYSET, STATIC o SCROLL, tutte le opzioni FETCH sono supportate.
  • I cursori DYNAMIC SCROLL supportano tutte le opzioni FETCH, ad eccezione di ABSOLUTE.

La funzione @@FETCH_STATUS restituisce lo stato dell'ultima istruzione FETCH. Le stesse informazioni vengono registrate nella colonna fetch_status del cursore restituito dalla stored procedure sp_describe_cursor. In base a queste informazioni sullo stato, è necessario determinare la validità dei dati restituiti da un'istruzione FETCH prima di eseguire qualsiasi operazione con i dati. Per ulteriori informazioni, vedere @@FETCH_STATUS.

Autorizzazioni

Le autorizzazioni per l'istruzione FETCH vengono assegnate per impostazione predefinita a qualsiasi utente valido.

Esempi

A. Utilizzo dell'istruzione FETCH in un cursore semplice

Nell'esempio seguente viene dichiarato un cursore semplice per le righe della tabella Person.Contact contenenti un cognome che inizia per B. Viene inoltre utilizzata l'istruzione FETCH NEXT per la riproduzione delle varie righe. Le istruzioni FETCH restituiscono il valore delle colonne specificate nell'istruzione DECLARE CURSOR, come set di risultati a riga singola.

USE AdventureWorks
GO
DECLARE contact_cursor CURSOR FOR
SELECT LastName FROM Person.Contact
WHERE LastName LIKE 'B%'
ORDER BY LastName

OPEN contact_cursor

-- Perform the first fetch.
FETCH NEXT FROM contact_cursor

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM contact_cursor
END

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

B. Utilizzo dell'istruzione FETCH per archiviare valori nelle variabili

Questo esempio è simile al precedente, con la sola differenza che il risultato delle istruzioni FETCH viene archiviato in variabili locali anziché essere restituito direttamente al client. L'istruzione PRINT combina le variabili in un'unica stringa e le restituisce al client.

USE AdventureWorks
GO
-- Declare the variables to store the values returned by FETCH.
DECLARE @LastName varchar(50), @FirstName varchar(50)

DECLARE contact_cursor CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
WHERE LastName LIKE 'B%'
ORDER BY LastName, FirstName

OPEN contact_cursor

-- Perform the first fetch and store the values in variables.
-- Note: The variables are in the same order as the columns
-- in the SELECT statement. 

FETCH NEXT FROM contact_cursor
INTO @LastName, @FirstName

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN

   -- Concatenate and display the current values in the variables.
   PRINT 'Contact Name: ' + @FirstName + ' ' +  @LastName

   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM contact_cursor
   INTO @LastName, @FirstName
END

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

C. Dichiarazione di un cursore SCROLL e utilizzo delle altre opzioni FETCH

Nell'esempio seguente viene creato un cursore SCROLL per supportare funzioni di scorrimento complete attraverso le opzioni LAST, PRIOR, RELATIVE e ABSOLUTE.

USE AdventureWorks
GO
-- Execute the SELECT statement alone to show the 
-- full result set that is used by the cursor.
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName

-- Declare the cursor.
DECLARE contact_cursor SCROLL CURSOR FOR
SELECT LastName, FirstName FROM Person.Contact
ORDER BY LastName, FirstName

OPEN contact_cursor

-- Fetch the last row in the cursor.
FETCH LAST FROM contact_cursor

-- Fetch the row immediately prior to the current row in the cursor.
FETCH PRIOR FROM contact_cursor

-- Fetch the second row in the cursor.
FETCH ABSOLUTE 2 FROM contact_cursor

-- Fetch the row that is three rows after the current row.
FETCH RELATIVE 3 FROM contact_cursor

-- Fetch the row that is two rows prior to the current row.
FETCH RELATIVE -2 FROM contact_cursor

CLOSE contact_cursor
DEALLOCATE contact_cursor
GO

Vedere anche

Riferimento

CLOSE (Transact-SQL)
DEALLOCATE (Transact-SQL)
DECLARE CURSOR (Transact-SQL)
OPEN (Transact-SQL)

Altre risorse

Cursori Transact-SQL

Guida in linea e informazioni

Assistenza su SQL Server 2005