update tipos recorrer loop for fetch_status ejemplo cursores anidados sql-server database-cursor

sql-server - tipos - select cursor sql server



¿Cuál es el uso de un cursor en SQL Server? (5)

los cursores se utilizan porque en la sub consulta podemos obtener registros fila por fila, así que usamos el cursor para recuperar registros

Ejemplo de cursor:

DECLARE @eName varchar(50), @job varchar(50) DECLARE MynewCursor CURSOR -- Declare cursor name FOR Select eName, job FROM emp where deptno =10 OPEN MynewCursor -- open the cursor FETCH NEXT FROM MynewCursor INTO @eName, @job PRINT @eName + '' '' + @job -- print the name WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM MynewCursor INTO @ename, @job PRINT @eName +'' '' + @job -- print the name END CLOSE MynewCursor DEALLOCATE MynewCursor

SALIDA:

ROHIT PRG jayesh PRG Rocky prg Rocky prg

Quiero usar un cursor de base de datos; ¿Primero necesito entender de qué se trata su uso y sintaxis, y en qué escenario podemos usar esto en procedimientos almacenados? ¿Existen diferentes sintaxis para diferentes versiones de SQL Server?

¿Cuándo es necesario utilizar?


El cursor en sí es un iterador (como WHILE). Al decir iterador me refiero a una forma de recorrer el conjunto de registros (también conocido como un conjunto de filas de datos seleccionadas) y realizar operaciones en él mientras se atraviesa. Las operaciones pueden ser INSERT o DELETE por ejemplo. Por lo tanto, puede utilizarlo para la recuperación de datos, por ejemplo. El cursor funciona con las filas del conjunto de resultados de forma secuencial, fila por fila. Un cursor puede verse como un puntero a una fila en un conjunto de filas y solo puede hacer referencia a una fila a la vez, pero puede moverse a otras filas del conjunto de resultados según sea necesario.

Este link puede tener una explicación clara de su sintaxis y contiene información adicional más ejemplos.

Los cursores también se pueden utilizar en Sprocs. Son un acceso directo que le permite utilizar una consulta para realizar una tarea en lugar de varias consultas. Sin embargo, los cursores reconocen el alcance y se consideran indefinidos fuera del alcance del sproc y sus operaciones se ejecutan en un solo procedimiento. Un procedimiento almacenado no puede abrir, recuperar o cerrar un cursor que no se haya declarado en el procedimiento.


El cursor podría usarse para recuperar datos base por fila. Es como una declaración de bucle (es decir, while o para bucle). Para usar cursores en procedimientos de SQL, debe hacer lo siguiente: 1. Declarar un cursor que define un conjunto de resultados. 2.Abra el cursor para establecer el conjunto de resultados. 3.Reciba los datos en las variables locales según sea necesario desde el cursor, una fila a la vez. 4.Cierre el cursor cuando haya terminado.

por ej.

declare @tab table ( Game varchar(15), Rollno varchar(15) ) insert into @tab values(''Cricket'',''R11'') insert into @tab values(''VollyBall'',''R12'') declare @game varchar(20) declare @Rollno varchar(20) declare cur2 cursor for select game,rollno from @tab open cur2 fetch next from cur2 into @game,@rollno WHILE @@FETCH_STATUS = 0 begin print @game print @rollno FETCH NEXT FROM cur2 into @game,@rollno end close cur2 deallocate cur2


Los cursores son un mecanismo para enumerar explícitamente a través de las filas de un conjunto de resultados, en lugar de recuperarlo como tal.

Sin embargo, si bien pueden ser más cómodos de usar para los programadores acostumbrados a escribir While Not RS.EOF Do ... , por lo general, es algo que se debe evitar dentro de los procedimientos almacenados de SQL Server, si es posible, si puede escribir una consulta. sin el uso de cursores, le da al optimizador una mejor oportunidad de encontrar una manera rápida de implementarlo.

Honestamente, nunca he encontrado un caso de uso realista para un cursor que no se pueda evitar, con la excepción de algunas tareas administrativas, como recorrer en bucle todos los índices del catálogo y reconstruirlos. Supongo que pueden tener algunos usos en la generación de informes o la combinación de correos, pero probablemente sea más eficiente realizar el trabajo de tipo cursor en una aplicación que se comunica con la base de datos, permitiendo que el motor de la base de datos haga lo que mejor hace: la manipulación de conjuntos.


Yo diría que es posible que desee utilizar un cursor cuando desee hacer comparaciones de características que se encuentran en diferentes filas del conjunto de devolución, o si desea escribir un formato de fila de salida diferente al estándar en ciertos casos. Dos ejemplos vienen a la mente:

  1. Uno estaba en una universidad en la que cada adición y eliminación de una clase tenía su propia fila en la tabla. Podría haber sido un mal diseño, pero necesitaba comparar filas para saber cuántas filas agregar y soltar tenía para determinar si la persona estaba en la clase o no. No puedo pensar en una manera directa de hacerlo con solo SQL.

  2. Otro ejemplo es escribir una línea total de revistas para revistas GL. Obtiene un número arbitrario de débitos y créditos en su publicación, tiene muchas publicaciones en el retorno de su conjunto de filas y desea escribir una línea del total de la revista cada vez que finalice una publicación para publicarla en un Libro mayor. Con un cursor, usted podría decir cuándo dejó un diario y comenzó otro y tiene acumuladores para sus débitos y créditos y escribe una línea total del diario (o una inserción de tabla) que fue diferente a la línea de débito / crédito.