FETCH (Transact-SQL)
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure database SQL in Microsoft Fabric
Recupera una riga specifica da un cursore server TRansact-SQL.
Convenzioni relative alla sintassi Transact-SQL
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. Sen o @nvar è un valore negativo, restituisce la riga corrispondente a n righe prima della fine del cursore e imposta la riga restituita come nuova riga corrente. Se n o @nvar è 0 non vengono restituite righe. n deve essere una costante integer e @nvar deve essere 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 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 smallint, tinyint o int.
GLOBAL
Specifica che 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 con nome cursor_name, cursor_name indica il cursore globale se la parola chiave GLOBAL viene specificata e il cursore locale se la parola chiave GLOBAL viene omessa.
@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 l'opzione SCROLL
non è specificata in un'istruzione DECLARE CURSOR
in formato ISO, NEXT
è l'unica opzione FETCH
supportata. Se SCROLL
viene specificata in formato ISO in un'istruzione DECLARE CURSOR
, tutte le opzioni FETCH
sono supportate.
Quando vengono utilizzate le estensioni del cursore DECLARE di Transact-SQL, vengono applicate le regole seguenti:
Se
FORWARD_ONLY
oFAST_FORWARD
è specificata,NEXT
è l'unica opzioneFETCH
supportata.Se
DYNAMIC
,FORWARD_ONLY
oFAST_FORWARD
non è specificata e una traKEYSET
,STATIC
oSCROLL
è specificata, tutti le opzioniFETCH
sono supportate.I cursori
DYNAMIC SCROLL
supportano tutte le opzioniFETCH
ad eccezione diABSOLUTE
.
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 (Transact-SQL).
Autorizzazioni
Le autorizzazioni per l'istruzione FETCH
vengono assegnate per impostazione predefinita a qualsiasi utente valido.
Esempi
R. Utilizzo dell'istruzione FETCH in un cursore semplice
Nell'esempio seguente viene dichiarato un cursore semplice per le righe della tabella Person.Person
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 AdventureWorks2022;
GO
DECLARE contact_cursor CURSOR FOR
SELECT LastName FROM Person.Person
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
L'esempio seguente è simile all'esempio A, 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 AdventureWorks2022;
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.Person
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 AdventureWorks2022;
GO
-- Execute the SELECT statement alone to show the
-- full result set that is used by the cursor.
SELECT LastName, FirstName FROM Person.Person
ORDER BY LastName, FirstName;
-- Declare the cursor.
DECLARE contact_cursor SCROLL CURSOR FOR
SELECT LastName, FirstName FROM Person.Person
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
Vedi anche
CLOSE (Transact-SQL)
DEALLOCATE (Transact-SQL)
DECLARE CURSOR (Transact-SQL)
OPEN (Transact-SQL)