FETCH (Transact-SQL)

Recupera una fila específica de un cursor de servidor de Transact-SQL.


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

NEXT

Devuelve la fila de resultados inmediatamente posterior a la fila actual, y aumenta la fila actual a la fila devuelta. Si FETCH NEXT es la primera operación de recuperación en un cursor, se devuelve la primera fila del conjunto de resultados. NEXT es la opción predeterminada para la recuperación de cursores.

PRIOR

Devuelve la fila de resultados inmediatamente anterior a la fila actual, y reduce la fila actual a la fila devuelta. Si FETCH PRIOR es la primera operación de recuperación en un cursor, no se devuelve ninguna fila y el cursor queda posicionado delante de la primera fila.

FIRST

Devuelve la primera fila del cursor y la convierte en la fila actual.

LAST

Devuelve la última fila del cursor y la convierte en la fila actual.

ABSOLUTE { n | @nvar}

Si n o @nvar es positivo, se devuelve la fila n desde el principio del cursor y se convierte en la nueva fila actual. Si n o @nvar es negativo, se devuelve la fila n anterior al final del cursor y se convierte en la nueva fila actual. Si n o @nvar es 0, no se devuelve ninguna fila. n debe ser una constante entera y @nvar debe ser smallint, tinyint o int.

RELATIVE { n | @nvar}

Si n o @nvar es positivo, se devuelve la fila n posterior a la fila actual y se convierte en la nueva fila actual. Si n o @nvar es negativo, se devuelve la fila n anterior a la fila actual y se convierte en la nueva fila actual. Si n o @nvar es 0, se devuelve la fila actual. Si se especifica FETCH RELATIVE con n o @nvar establecido en un número negativo o en 0 en la primera operación de recuperación que se realiza en un cursor, no se devuelven filas. n debe ser una constante entera y @nvar debe ser smallint, tinyint o int.

GLOBAL

Especifica que cursor_name hace referencia a un cursor global.

cursor_name

Es el nombre del cursor abierto desde el que se debe realizar la recuperación. Si existen un cursor global y otro local denominados cursor_name, cursor_name hace referencia al cursor global si se especifica GLOBAL y al cursor local si no se especifica GLOBAL.

@cursor_variable_name

Es el nombre de una variable de cursor que hace referencia al cursor abierto desde el que se va efectuar la recuperación.

INTO @variable_name[ ,...n]

Permite colocar en variables locales los datos de las columnas de una recuperación. Todas las variables de la lista, de izquierda a derecha, están asociadas a las columnas correspondientes del conjunto de resultados del cursor. El tipo de datos de cada variable tiene que coincidir o ser compatible con la conversión implícita del tipo de datos de la columna correspondiente del conjunto de resultados. El número de variables debe coincidir con el número de columnas de la lista de selección del cursor.

Si no se especifica la opción SCROLL en una instrucción DECLARE CURSOR de SQL-92, NEXT es la única opción admitida para FETCH. Si se especifica SCROLL en una instrucción DECLARE CURSOR de SQL-92, se admiten todas las opciones de FETCH.

Cuando se utilizan las extensiones de cursor DECLARE de Transact-SQL, se aplican las reglas siguientes:

  • Si se especifica FORWARD-ONLY o FAST_FORWARD, NEXT es la única opción de FETCH admitida.
  • Si no se especifica DYNAMIC, FORWARD_ONLY o FAST_FORWARD, y se especifica KEYSET, STATIC o SCROLL, se admiten todas las opciones de FETCH.
  • Los cursores DYNAMIC SCROLL admiten todas las opciones de FETCH excepto ABSOLUTE.

La función @@FETCH_STATUS informa del estado de la última instrucción FETCH. La misma información queda grabada en la columna fetch_status del cursor devuelto por sp_describe_cursor. Esta información de estado se debe utilizar para determinar la validez de los datos devueltos por una instrucción FETCH antes de iniciar cualquier operación con esos datos. Para obtener más información, vea @@FETCH_STATUS.

De forma predeterminada, todos los usuarios válidos tienen permisos para ejecutar FETCH.

A. Utilizar FETCH en un cursor sencillo

En este ejemplo se declara un cursor sencillo para las filas de la tabla Person.Contact cuyo apellido empiece por B y se utiliza FETCH NEXT para recorrer las filas paso a paso. Las instrucciones FETCH devuelven el valor de la columna especificada en DECLARE CURSOR como un conjunto de resultados de una sola fila.

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. Utilizar FETCH para almacenar valores en variables

Este ejemplo es similar al ejemplo anterior, con la diferencia de que la salida de las instrucciones FETCH se almacena en variables locales en lugar de devolverse directamente al cliente. La instrucción PRINT combina las variables en una misma cadena y la devuelve al cliente.

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. Declarar un cursor SCROLL y utilizar el resto de las opciones de FETCH

En este ejemplo se crea un cursor SCROLL para proporcionar todas las funciones de desplazamiento mediante las opciones LAST, PRIOR, RELATIVE y 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

Adiciones de comunidad

AGREGAR
Mostrar: