Crear un Cursor SQL Server
Saludos, En esta ocación voy a mostrarle como crear un cursor en SQL Server y explicar la importancia del mismo.
Un cursor es una herramienta de SQL Server que nos permite recorrer el resultado de una consulta SQL y realizar operaciones con estos resultados dentro de un bucle de datos.
Para mostrar la sintaxis del cursor utilizemos el siguiente planteamiento, tenemos una tabla denominada persona y deseamos imprimir en pantalla los nombres y apellidos de todos los registros almacenados en la table persona.
La sintaxis de declaración de un cursor es la siguiente:
declare cursor_prueba cursor for
select nombres, apellidos from persona
/*ahora declaramos las variables con las que vamos a recorrer el cursor:*/
declare @nombres varchar(25)
declare @apellidos varchar(25)
/*Abrimos el cursor para iniciar el recorrido del mismo*/
open cursor_prueba
/*Se mueve al siguiente registro dentro del cursor y los asignamos a las variables antes declaradas*/
fetch next from cursor_prueba
into @nombres, apellidos
/*Retorna el estatus del último registro recorrido en el cursor, cuando es igual a 0 encontró registro pendientes de recorrer*/
while @@fetch_status = 0
begin
print 'El Nombre de la persona es: ' + @nombres + ' y sus apellidos: ' + apellidos
/*Se mueve al siguiente registro dentro del cursor*/
fetch next from cursor_prueba
into @nombres, apellidos
end
/* Cuando concluimos con el recorrido del cursor, este debe ser cerrado y luego destruído mediante las siguientes sentencias:*/
close cursor_prueba --Cierra el cursor.
deallocate cursor_prueba --Lo libera de la memoria y lo destruye.
Los cursores son muy eficientes para utilizarlos en Job de las base de datos que realizen alguna operación donde necesitemos modificar alguna información dentro de un bucle. Los cursores demandan mucho del servidor de base datos, por lo tanto, no es recomendable abusar del mismo, ya que necesitan bastante recursos para su ejecución
Un cursor es una herramienta de SQL Server que nos permite recorrer el resultado de una consulta SQL y realizar operaciones con estos resultados dentro de un bucle de datos.
Para mostrar la sintaxis del cursor utilizemos el siguiente planteamiento, tenemos una tabla denominada persona y deseamos imprimir en pantalla los nombres y apellidos de todos los registros almacenados en la table persona.
La sintaxis de declaración de un cursor es la siguiente:
declare cursor_prueba cursor for
select nombres, apellidos from persona
/*ahora declaramos las variables con las que vamos a recorrer el cursor:*/
declare @nombres varchar(25)
declare @apellidos varchar(25)
/*Abrimos el cursor para iniciar el recorrido del mismo*/
open cursor_prueba
/*Se mueve al siguiente registro dentro del cursor y los asignamos a las variables antes declaradas*/
fetch next from cursor_prueba
into @nombres, apellidos
/*Retorna el estatus del último registro recorrido en el cursor, cuando es igual a 0 encontró registro pendientes de recorrer*/
while @@fetch_status = 0
begin
print 'El Nombre de la persona es: ' + @nombres + ' y sus apellidos: ' + apellidos
/*Se mueve al siguiente registro dentro del cursor*/
fetch next from cursor_prueba
into @nombres, apellidos
end
/* Cuando concluimos con el recorrido del cursor, este debe ser cerrado y luego destruído mediante las siguientes sentencias:*/
close cursor_prueba --Cierra el cursor.
deallocate cursor_prueba --Lo libera de la memoria y lo destruye.
Los cursores son muy eficientes para utilizarlos en Job de las base de datos que realizen alguna operación donde necesitemos modificar alguna información dentro de un bucle. Los cursores demandan mucho del servidor de base datos, por lo tanto, no es recomendable abusar del mismo, ya que necesitan bastante recursos para su ejecución
Comentarios
Salvo en situaciones extremas, dí NO A LOS CURSORES!!!!
Nunca digas No a nada que te puede sacar de un apuro, es cierto que los cursores aumento de forma exponencial el uso del CPU haciendo que la base de datos presente bloqueos, pero todo depende del programador y su experiencia y el uso que le vas a dar a ese cursor, para actualizaciones masivas que no se van a ejecutar siempre, para que programar si lo puedes hacer de forma sencilla con un cursor.
DECLARE CURSOR must be the only statement in a query batch.
Estoy creando un cursor dentro de un sp el cual va a recorrer los impuestos de mi proveedor e imprimira los impuestos q el posee
DECLARE CursorImpuesto CURSOR FOR SELECT cod_impuesto FROM tmp_rpte_prov_impuesto
DECLARE @Id_Codigo numeric(2,0)
OPEN CursorImpuesto
FETCH NEXT FROM CursorImpuesto INTO @Id_Codigo
WHILE @@fetch_status = 0
BEGIN
PRINT @Id_Codigo
FETCH NEXT FROM CursorImpuesto INTO @Id_Codigo
END
CLOSE CursorImpuesto
DEALLOCATE CursorImpuesto
Se los agradezco
DECLARE @Id_Codigo numeric(2,0)
DECLARE CursorImpuesto CURSOR FOR SELECT cod_impuesto FROM tmp_rpte_prov_impuesto
OPEN CursorImpuesto
puedes probar de esa forma.
Excelente explicacion. Muy agradecido por todo.
Te animo a que sigas adelante con el blog.
EJEMPLO:
CREATE FUNCTION verCruceCursos(@curso1 as char(2),@curso2 as char(2))
RETURNS varchar(15)
as
BEGIN
declare @respuesta varchar(15)
set @respuesta = 'No Existe Cruce'
declare curCurso1 cursor for select dia,horainicio,duracion from horarios where curso=@curso1
declare @dia1 char(10)
declare @inicio1 int,@duracion1 int
open curCurso1
fetch next from curCurso1 into @dia1,@inicio1,@duracion1
while @@fetch_status = 0 --> A PARTIR DE AKI NO LEE NADA
begin
-- inicio cursor 1
declare curCurso2 cursor for
select dia,horainicio,duracion from horarios where curso=@curso2
.. etc
fetch next from cursor_prueba
into @nombres, @apellidos
alter proc SP1
as
declare MiCursor cursor for -- declaro el cursor para
select id, valor, texto from Datos
order by id --ordena la tabla
declare @id Int
declare @valor int
declare @texto varchar
open MiCursor --abrimos el cursor
create table #paso (palabra varchar(100), cantidad int)
fetch next from MiCursor
into @id,@valor,@texto
if @@fetch_status <> 0
print ' No hay registros ' ;
while @@fetch_status = 0
begin
insert #paso
exec SeparaPalabras @texto
insert palabra
select @id,@valor, palabra, cantidad from #paso
where rtrim(palabra) is not null
Select * from #Paso
delete #paso
Fetch next from MiCursor
into @id ,@valor,@texto
end
close MiCursor
deallocate MiCursor
drop table #paso
Al ejecutarlpo me sale el siguiente error
Msg 16915, Level 16, State 1, Procedure SP1, Line 5
A cursor with the name 'MiCursor' already exists.
Msg 16905, Level 16, State 1, Procedure SP1, Line 12
The cursor is already open.
Gracias, Alejandra
...mmm... lo mejor seria queee...
en vez de 2 cursores, Hazte 4 CURSORES.
ASI TE DAN EL SOBRE AZUL Y QUEDAS LISTO!!, CON BILLETES $$$, EN EL BOLSILLO.
Luego buscas trabajo en otra empresa y pides el aumento que tanto quieres.
Resumen : Trabajo Nuevo y Plata para que te des los gustos.
...y todo por querer buscar la forma de complicar las cosas, cuando la respuesta es mas sencilla.
Saludos.
todo en muy buena onda!!.
Saludos, en buena onda.
Que bueno que haya personas que comparten sus conocimientos y ayudan a los demas, eres un ejemplo a seguir, al menos para mi :)
Saludos desde Puebla, Mexico.
alexa.avf@gmail.com
@Alexa_avf
tengo el valor 09-23-13 13:00:10 en char que es fecha y hora, como lo puedo convertir a smalldatetime?
GRACIAS...
select convert(datetime, fec_che) as fecha from t_checador
solo que marca el sig error:
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
y eso es solo en el select, yo lo quiero insertar en una tabla donde el tipo de dato es smalldatetime.
gracias...
=)
Crear un Stored procedure que
utilizando un curso realice lo siguiente
Obtener la fecha de nacimiento y calcular
la edad y actualizar el campo EDAD.
CREATE TABLE ALUMNOS (
ID_ALUMNO NUMBER(3),
NOMBRE VARCHAR2(100),
APELLIDO_PATERNO VARCHAR2(100),
APELLIDO_MATERNO VARCHAR2(100),
FECHA_NAC DATE,
FECHA_GRAD DATE,
MES_NAC VARCHAR2(20)
DIA_GRAD VARCHAR2(20)
EDAD NUMBER(2);