Microsoft SQL Server
Cursores
Buscar..
Sintaxis
- DECLARAR cursor_name CURSOR [LOCAL | GLOBAL]
- [FORWARD_ONLY | SCROLL]
[ESTÁTICA | KEYSET | Dinamica | AVANCE RÁPIDO ]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTA]
[TYPE_WARNING] - PARA select_statement
- [PARA ACTUALIZACIÓN [OF column_name [, ... n]]]
- [FORWARD_ONLY | SCROLL]
Observaciones
Normalmente, desearía evitar el uso de cursores, ya que pueden tener un impacto negativo en el rendimiento. Sin embargo, en algunos casos especiales, es posible que deba recorrer su registro de datos por registro y realizar alguna acción.
Cursor de avance solo básico
Normalmente, desearía evitar el uso de cursores, ya que pueden tener un impacto negativo en el rendimiento. Sin embargo, en algunos casos especiales, es posible que deba recorrer su registro de datos por registro y realizar alguna acción.
DECLARE @orderId AS INT
-- here we are creating our cursor, as a local cursor and only allowing
-- forward operations
DECLARE rowCursor CURSOR LOCAL FAST_FORWARD FOR
-- this is the query that we want to loop through record by record
SELECT [OrderId]
FROM [dbo].[Orders]
-- first we need to open the cursor
OPEN rowCursor
-- now we will initialize the cursor by pulling the first row of data, in this example the [OrderId] column,
-- and storing the value into a variable called @orderId
FETCH NEXT FROM rowCursor INTO @orderId
-- start our loop and keep going until we have no more records to loop through
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @orderId
-- this is important, as it tells SQL Server to get the next record and store the [OrderId] column value into the @orderId variable
FETCH NEXT FROM rowCursor INTO @orderId
END
-- this will release any memory used by the cursor
CLOSE rowCursor
DEALLOCATE rowCursor
Sintaxis del cursor rudimentario
Una simple sintaxis de cursor, que funciona en algunas filas de prueba de ejemplo:
/* Prepare test data */
DECLARE @test_table TABLE
(
Id INT,
Val VARCHAR(100)
);
INSERT INTO @test_table(Id, Val)
VALUES
(1, 'Foo'),
(2, 'Bar'),
(3, 'Baz');
/* Test data prepared */
/* Iterator variable @myId, for example sake */
DECLARE @myId INT;
/* Cursor to iterate rows and assign values to variables */
DECLARE myCursor CURSOR FOR
SELECT Id
FROM @test_table;
/* Start iterating rows */
OPEN myCursor;
FETCH NEXT FROM myCursor INTO @myId;
/* @@FETCH_STATUS global variable will be 1 / true until there are no more rows to fetch */
WHILE @@FETCH_STATUS = 0
BEGIN
/* Write operations to perform in a loop here. Simple SELECT used for example */
SELECT Id, Val
FROM @test_table
WHERE Id = @myId;
/* Set variable(s) to the next value returned from iterator; this is needed otherwise the cursor will loop infinitely. */
FETCH NEXT FROM myCursor INTO @myId;
END
/* After all is done, clean up */
CLOSE myCursor;
DEALLOCATE myCursor;
Resultados del SSMS. Tenga en cuenta que todas estas son consultas separadas, de ninguna manera están unificadas. Observe cómo el motor de consultas procesa cada iteración una por una en lugar de como un conjunto.
Carné de identidad | Val |
---|---|
1 | Foo |
(1 fila (s) afectadas) |
Carné de identidad | Val |
---|---|
2 | Bar |
(1 fila (s) afectadas) |
Carné de identidad | Val |
---|---|
3 | Baz |
(1 fila (s) afectadas) |