Cursores en SQL Server

Los cursores son una herramienta de SQL que nos permite recorrer el resultado de una consulta SQL y realizar operaciones en cada paso de ésta.

Cursores SQlEs así como nos ayuda a realizar operaciones que de otro modo serían más complejas o irrealizables. A continuación coloco el código de un cursor muy simple para el Analizador de Consultas de SQL Server.

   /* Este cursor deja las contraseñas iguales al nombre de usuario.
  La tabla Cliente tiene estos tres campos: CliCod, CliUser, CliPass */
    -- declaramos las variables
        declare @cod as int
  declare @user as varchar(50)
  declare @pass as varchar(50)
    -- declaramos un cursor llamado "CURSORITO". El select debe contener sólo los campos a utilizar.
declare CURSORITO cursor for select CliCod, CliUser, CliPass from Cliente open CURSORITO -- Avanzamos un registro y cargamos en las variables los valores encontrados en el primer registro fetch next from CURSORITO into @cod, @user, @pass while @@fetch_status = 0 begin update Cliente set CliPass= @user where CliCod=@cod -- Avanzamos otro registro fetch next from CURSORITO into @cod, @rut, @nombres end -- cerramos el cursor close CURSORITO deallocate CURSORITO

Matías Thayer M.
Encargado del sitio de Webmagic, uno más de los miles de sitios para webmasters ;)
Mickel
26/02/2005

Solo que, segun entiendo, la recomendacion de MS para SQL Server es usar tablas temporales u otras tecnicas en lugar de cursores. Algun comentario?

    Isaias
    6/11/2009

    Totalmente de acuerdo, soy de la liga “anti-cursores” y el 99.99% de las cosas que se hacen con un cursor, se hacen con simple T-SQL.

    Recordemos que los cursores se crean en memoria, por tanto, degradan la respuesta del servidor, llegano incluso a “tirarlo”

TomaHawkk
28/02/2005

Los cursores en Sql server son lentos y si son recursivos sin comentarios…

Jorge_Mota
1/03/2005

si, en cuanto a rendimiento siempre sera mejor usar tablas temporales, aun que hay ocasiones que son imprescindibles, lo mejor es tratar de minimizar la cantidad de acciones que tomemos con el cursor, y lo que es mas, el select que utilizemos para el cursor, debera traer los registros exactos que necesitemos, y no luego filtrar el resultado obtenido en el cursor :)

hay muy buenos comentarios,por gurus de sql (en español) en este site

http://www.portalsql.com

Saludos

    Esteban
    15/03/2010

    Hagamos un buen uso de nuestro idioma, no solamente de nuestros “talentos” técnicos.
    Tienes un mal uso de la palabra “utilizemos”. Se escribe “utilicemos”. Solo usas la letra “Z” cuando escribes la palabra “utilizar”, “utilizamos”, etc.

    http://www.wordreference.com/conj/EsVerbs.asp?v=utilizar

morrey33
29/03/2005

Cuando es conveniente usar cursores y cuando tablas temporales ?
Quiza las aplicaciones que he hecho no son tan complicadas como para pensar en eso, pero me gustaria saber.
Muchas gracias

Mickel
29/03/2005

Creo que nunca es conveniente usar cursores a no ser que necesariamente tengas que recorrer los registros uno a uno y hacer operaciones.

rlivon
2/04/2005

En General siempre se puede actualizar las tablas temporales con actualizaciones masivas de datos. Con o sin tablas #temp_
Los cursores son un retorno al dbf, donde todo se hacía recorriendo registro a registro, pero en esa época no había otra opción.
Particularmente creo que el uso de cursores simplifica la solución de un problema, pero complica el código haciéndolo legible solo para el que lo hizo.
Si se decide quemar alguna neurona más, se podrá encontrar una opción que solucione el problema sin el uso de cursores. De eso estoy seguro, pero siempre habrá por allí gente que piense que cuanto más complicado programe, más tiempo durará en su trabajo. Claro que ninguno de nosotros nos identificamos con esta gente. ¿No?

leonixya
9/06/2005

Una pregunta para uds que parece que entienden bastante este tema de los cursores.
En mi laburo tenemos un sistema a medida hecho en clarion el cual ultimamente se cierra en los clientes con un error gpf, varias veces por dia.
viendo un trace del profiler descubri que aparecian frecuentemente exceptions en classevent tales como: Error: 1933, Severity: 16, State: 1
Error: 16954, Severity: 10, State: 1
Error: 213, Severity: 16, State: 7
Error: 1934, Severity: 16, State: 1
Error: 245, Severity: 16, State: 1
y estos aparecen casi siempre luego de un rpc:completed relacionado con cursores
exec sp_cursorclose 180152853 o
exec sp_cursorfetch 180152853, 2, 1, 20 o
exec sp_cursorunprepare 7167
Estos cierres del sistema se pueden deber a este uso de cursores ??
Es dificil para mi verificar si es un problema de programacion(no tengo el fuente) o un problema de las memos(hard) de los clientes ?
Hay en algun lugar informacion de los problemas que pueden surgir de la utilizacion de los cursores?
gracias

No Registrado
6/07/2005

Hay que saber cuando usar y no usar cursores. Estos son muy utiles para cierto tipo de operaciones sobre todo en un sistema transaccional, y el uso indiscriminado de tablas temporales puede dar un rendimiento muy pobre a la aplicación (http://www.programacion.net/bbdd/articulo/man_tablastemp/). Me ha tocado ver aplicaciones donde el uso de tablas temporales a provocado que las aplicaciones respondan muy pobremente. También hay que ver que cosas procesar en el servidor y que en el cliente, un error muy comun que hacen las personas que programan en visual basic y que están acostumbradas a hacer todo el procesamiento en el lado del cliente, inclusive no aprovechando la integridad referencial que el mismo manejador de base de datos maneja.

salu2.

Jorge Mota
31/10/2005

para los que vuelven a leer esto, o ingresen nuevamente, ahora que he visto este articulo de nuevo caigo en un error en el codigo que no identifique antes…

declare @cod as int
declare @user as varchar(50)
declare @pass as varchar(50)
esto deberia estar asi:

declare @cod as int, @user as varchar(50), @pass as varchar(50)

es decir en un solo declare, ya que es mas optimo para el sql server (segun la ayuda misma).

asi que pueden aprovechar este pequeño tip para optimizar sus querys y sp donde hagan uso del declare en varias lineas.

tambien prefieran las funciones definidas por el usuario ante los procedures :D
son mas optimas :D

JULS
22/05/2006

Ese ejemplo es una verguenza que clases de Ing. Informatico sos ???

    Daniel
    11/08/2010

    ¿Acaso tu no tienes sentido común que no te das cuenta que ese es un EJEMPLO simple que puede abrir la mente a una idea, o acaso tu necesitas ejemplos complejos y por eso seras un Ingeniero capaz de digerir la información?
    Cosas simples puedes transformarlas en cosas complejas, o en tus clases de ingeniería, o en tu experiencia, nunca te topaste con algo asi ? que absurdo y poco competente tu comentario. (Argentinito tenias que ser)

Francisco FBL
7/06/2006

Los cursores son buenos cuando estamos hablando de menos de 300 registros, las tablas temporales seria la mejor opción, pero si sabemos que la tabal temporal podria tener unos 1000 registros mejor utilecemos una variable de tipo table en lugar de la tabla temporal que se crea en el disco en la bd de Tempdb

Carlos
4/07/2006

Todo esto es una mierda,aprenda a programar bien para que no usen esa basura de cursores

francisco alberto
6/07/2006

tigueres eso no deja efectivo aprendan a manejar softwares que dejen dinero

stvmty
12/07/2006

En ocasiones hay que medir cual es la mejor opción de hacer las cosas. Justo ahora tengo dos opciones para cumplir un requerimiento de un sistema que estoy haciendo: Hacer los cálculos desde la BD usando cursores (ugh!) o hacer los cálculos desde la aplicación con muchisimos querys volando por aqui y por allá a través de la internet!!!

Pues si, los cursores deben ser la _última_ opción para cualquiera.

// http://stvmty.no-ip.info/ //

Xtreme
25/07/2006

¿Qué eso es lo poco que pueden publicar y encima piden que lo valore?
-Falta mas acerca de cursores

Gustavo
4/08/2006

En el mundo de las bases de datos es muy común la utilización de tablas temporales. A pesar de que todo el mundo sabe que este tipo de estructuras ralentizan el funcionamiento de nuestras consultas, los programadores no pueden evitar recurrir a ellas porque muchas veces facilitan la resolución de problemas. Almacenar datos para usarlos posteriormente, guardar resultados parciales, analizar grandes cantidades de filas. Hay muchos casos en los que podemos necesitar estas tablas temporales, ¡Pero hay que utilizarlas correctamente!
Tomado de: http://www.programacion.com/bbdd/articulo/man_tablastemp/

Sónico
17/08/2006

Prefiero las cosas sencillas y sin complicaciones…pero pues cada quien programa como quiere !!!

Saludos a todos

HOLA A TODOS, quiero saber como hago para borrar campos,todos los fin de mes, y se abran a las 01:00 AM del primer dia del mes siguiente.
Gracias

HOLA A TODOS, quiero saber como hago para borrar campos,todos los fin de mes, y se abran a las 01:00 AM del primer dia del mes siguiente.
Gracias

Greivin
30/08/2006

Una consulta:

Tengo que realizar la inserción de todo un select en otra tabla(historica) agregando algun dato adicional, la preguna es:

-¿Es mas eficiente realizar una o dos consultas para obtener los datos y que mi aplicación realice los calculos, para despues insertarlos en la base de datos?
- ¿Es eficiente hacerlo con cursores?
- Cual de las dos opciones brinda mayor velocidad? En una red de área local.

No Registrado
13/09/2006

JULS;1557896, Ese ejemplo es una verguenza que clases de Ing. Informatico sos ???

Y vos que clase de Ing. sos?, mejor ofrece una buena solucion para lo que aqui se pregunta y se discute…

    vicente
    7/01/2010

    Uyyyyyyyy, si que forma de ayudar, asi debe ser para todo en la vida, pero no nos preocupemos que siempre te los encontraras…afortunadamente son la minoria

FERNANDO
13/09/2006

Necesito poder detener el bucle del cursor… aqui hemos desarrallo una migracion de datos diaria en lotes… lo que ocurre es que lo realiza bien, pero cuando llega al ultimo dato sigue regresando con el mismo valor indefinidamente… se ve que el

while @@fetch_status = 0

NO LO PUEDE DETENER!!!

pichonservis
18/09/2006

salu2
bueno me parecio bueno el tuto aprendi un poco..y bueno algunas cosas que nada mas no entendia alli aprendi…gracias y suerte a todos….

Mickel
18/09/2006

Greivin;1680275, Una consulta:

Tengo que realizar la inserción de todo un select en otra tabla(historica) agregando algun dato adicional, la preguna es:

-¿Es mas eficiente realizar una o dos consultas para obtener los datos y que mi aplicación realice los calculos, para despues insertarlos en la base de datos?
- ¿Es eficiente hacerlo con cursores?
- Cual de las dos opciones brinda mayor velocidad? En una red de área local.

Es mas eficiente que hagas un
INSERT INTO
SELECT

Ing.1984
19/09/2006

este tema es buenisimo

Leo…
21/09/2006

…me gustaria me dijeran cual es el objetivo o ventaja principal de usar cursores , de esta forma me quedaria claro cuando debo y cuando no debo usarlos.

kofmaster
26/09/2006

nesecitamos hacer una uelga global para que el mundo comprenda que tan importante somos nosotros y aprendan a valorar los sistemas y nos paguen como es debido.

// http://seminarioutp.serverhttp.org/ // //

hasta cuando cursores por dios , ahora seguro quieren programar en basic, cambien el paradigma

Axel
18/10/2006

Quiero te ner un cursor pero el mismo cursor no quiero otro diferente

lizbeth rivera
6/11/2006

no encontre lo que andaba buscando

Sergio Gómez
9/11/2006

Los Cursores son una mierda complican el laburo.
tengo una aplicación en VB 6 pero
todo está hecho con Store Procedure con Cursores.
Parecen que la gente que laburo antes no sabían trabajar en equipo.

marlo
4/12/2006

es super básica la explicación pero sirve de todas formas.

Luis
5/12/2006

Buenoooo, la verdad es que con cursores se abre un abanico de posibilidades, de que hacer con cada linea de una tabla, que con otras sentencias sql no se puede hacer por ello de su existencia hasta ahora, asi que doy un voto por a los cursores, y para los que preguntan de como hacer que a cierta hora y fecha se haga algo el equipo relacionado con la base de datos, pues genera la aplicacion que elimine los datos o agregue datos aqui uno hace lo que desee con su aplicacion generas tu ejecutable, luego en el programador de tarea asigna una tarea de que cada fin de mes a la hora que necesite se ejecute esa aplicacion como ejemplo (miaplicacion.exe) y listo, y tambien recordaros que con procedimientos almacenados que ya estan compilados en el mismo servidor de base de datos las sentencias son mas rapidas que escribir las sentencias en el programa, y para el amigo que necesita saber si con una o dos consultas pues con una sola anidada asigna el insert de una seleccion que ya trae el calculo en la misma sentencia.
Atte. Luis

Muchos comentarios hasta con tintes racistas hacia los cursores no?…
Es Simple.. No uses Cursores ni Tablas temporales…
Claro q hay muchos casos q no puedes hacer otra cosa mas q emplear alguno de estos recursos, pero el error radica en inmediatamente pensar en un cursor, el 80% de las cosas que se hacen con cursores se pueden hacer usando bien subquerys…
o estoy mal?..
Saludos…

Rama
22/12/2006

Existe alguna forma de definir la cadencia de un cursor, es decir, cada cuanto tiempo va de un paso a otro?
Como meterle una pausa o algo asi…

Alecks
28/12/2006

Una forma de evitar los cursores es la utililización de Sub Consultas asi no se tiene que procesar mediante un cursor. o utilizar variables de tipo table para que sea mas rapido el proceso de recorrer el cursor para evitar que la tabla(s) se bloqueen

JAMES
23/01/2007

HOLA AMIGOS ESTOY HACIENDO UN PEQUEÑO SISTEMA DE PRESTAMO DE EQUIPOS AUDIOVISUALES NECESITO SU AYUDA. EL PROBLEMA ES EL SIGUIENTE TENGO UNA TABLA PRESTAMOS DONDE TENGO LOS CAMPOS NOMBREEQUIPO, FECHAUSO,HORAUSO,FECHAFINAL,HORAFINAL. EL CHISTE ES NO SE PERMITA QUE SI UN EQUIPO YA ESTA RESERVADO A LA HORA INDICA Y FECHA NO PERMITA QUE SE PUEDA RESERVAR Y QUE VERIFIQUE LAS HORAS Y FECHAS DISPONIBLES.. NO SE SI ME EXPLIQUE

CARLOS
15/02/2007

PUEDES TRABAJARLO CON UN ESTADO DENTRO DE LA MISMA TABLA, EL CUAL T INDICARA SI EL EQUIPO ESTA RESERVADO O YA ESTA EN PRESTAMO

Alejandro
19/02/2007

Yo de nuevo cai en este articulo pedorr, qiuero saber cual es la limitacion de los cursores y uds pelotudean

anonimo
8/03/2007

que webean argentinos culiaos

Eugenia
13/03/2007

con respecto a la pregunta de Paz debes crear una tarea en SQL que sea una vez al mes e indicandole la hora de ejecución de tu procedimiento.

RAFAEL
13/03/2007

COMO PUEDO CAMBIAR UN REGISTRO SI EL CAMPO ES ES PRIMARIO EJM: SI EL RANGO ESTA DE (761-1114) AL (1-105)
LO HE INTENTADO CON EL UPDATE

Helen
27/08/2007

Pues a mi si me sirvió el artículo publicado creo que al menos deja claro cual es el papel del cursor y me resolvió mis dudas creo que si tan buenos son deberían de poner el equivalente del ejemplo del artículo pero sin usar cursores no creen, esto es para los expertos en sql saludos

Luis Arcuri
21/09/2007

Yo no soy ningún experto, pero el cursor de arriba podría reeplazarse por:

UPDATE CLIENTES SET CLIPASS = CLIUSER FROM CLIENTES

si se quisiera poner alguna condicion podría ponerse una clausula where …

Jorge Muchica
23/09/2007

entiendo q el cursor segun lo q se comenta en el articulo, se parece como una lista enlasada, donde solo tienes acceso a un registro a la vez, su facilidad de consultarlo. Ummm pq le pusiseron nombre CURSOR???

Jorge
26/11/2007

Toda esta discusión es una tontería. Es como discutir si solo alcanza con el cuchillo para comer y dejamos de usar el tenedor…
La experiencia les dirá cuando conviene usar una herramienta u otra. Yo les digo que si las tablas tienen millones de registros, el hacer un UPDATE es suicida porque tarda horas y mientras tanto, la tabla bloqueada… Ahí los cursores permiten partir la operación en muchos pequeños bloques que permiten al resto de los usuarios seguir trabajando.

enrique
12/12/2007

como puedo llamar de sql a visual basic.net?????

Bayta Darell
24/01/2008

Se puso buena la discusión de los cursores. mas q el contenido del articulo en sí.

Sí, sí… Los cursores no son muy eficaces q digamos, al igual que las subconsultas, y si hablamos de cursores mezclados con subconsultas la cosa esta bien jodida.

Saludos!

sandra
13/02/2008

me podrian ayudar con algo, es que tengo que hacer un procedimiento que sea recursivo pero cuando le meto los cursores, cada vez que hace la recursividad me sale error de que el cursor ya esta abierto, la idea es que el procedimiento me lea un arbol de arriba a abajo y que me de los descendientes de un nodo.

Luis Arcuri
14/02/2008

Sandra, haceme acordar que no te deje tocar mi servidor de base de datos… Es que usar cursores recursivos… espero que no sea grande la Base.
En cuanto al Update, es mucho más rápido que usar cursores, y si haces update a toda la tabla deberá demorarse lo necesario, aunque no necesariamente tenes que hacerlo sobre toda la tabla, pero es la opción más rápida. Además deberán cuidar los índices de las tablas que se esten leyendo para hacer el update.

mgavilat
15/02/2008

Un mensaje para el usuario JULS
Es un grosero y descortes. Deja que cada quien exprese lo que conoce. Tu decides si lo usas o no.

gusta1308
8/04/2008

Voto por no usar nada que no sean consultas o subconsultas, sin embargo he tenido que generar reporte generenciales complejos y utilizo los recursos en el siguiente oden prioridad: variables de tablas, cursores y por ultimo tablas temporales fijas, nada ##temp, trabajo para una trasnacional donde el uso de dbTemp por parte de una ##temp hay que pagarlo a parte. Y los cursores son realmente rapidos, la lentitud en ellos radica generalmente en las operaciones que se hacen por cada linea de ejecución, sin embargo para SQL Server 2000 existe un bug que ocurre cuendo corremos un cursor sobre una variable de tabla, donde el servidor se queda sin hacer nada y consumiendo memoria al rededor de 15 mins.

gusta1308
8/04/2008

Y por ultimo alguien pidio la mas simple que los cursores existe, se conoce como cursores no estandar o clausula FOR, esta presente en servidores como Interbase/Firebird, Postgre entre otros

oxiens
16/05/2008

SI ALGUIEN ME PODRIA AYUDAR EN ESTE PROBLEMA:
TENGO UN CURSOR, PERO EN CIERTA CONDICION NECESITO SALIRME DEL CURSOR PORQUE YA NO NECESITO QUE RECORRA TODO EL CURSOR.
cOMO PUEDO HACER?

CALLESE PUTO HOYGAN!

Xio
6/08/2008

Graicias

salas
14/08/2008

soy un novato en la BD’s pero a pero a pesar de todo pude aprender un poco de ustedes gracias. (Salas “UAIM”)

Respecto al uso de cursores me parece bien tener cada fila en detalle, porque puedo manipularlo de una mejor forma, pero cuando en la BD existe muchos registros, manejarlo a detalle ya se complica… como dijeron muchos hay que ver cuando usar cursores y cuando no…

Fantasmita
28/08/2008

PAZ

Tienes que crear una Tarea en la parte de MANAGEMENT de SQL Server y activar el SQL Server Agent para que este pueda ejecutar las tareas a la hora que necesitas que pase.

————–
“Quiero saber como hago para borrar campos,todos los fin de mes, y se abran a las 01:00 AM del primer dia del mes siguiente.”

Fantasmita
28/08/2008

Por lo que veo aquí hay mucha gente que le vale un pepino como hacer las cosas, por ese tipo de gente he tenido muchos problemas cuando hago reingenieria de procesos para bases de datos y código duro.

Ojalá aprendieran a optimizar sus desarrollos y dejar que ciertas acciones las realice el servidor y ciertas acciones el cliente.

Si no saben lo que es programar en CAPAS entonces realmente están haciendo trabajo que sus empresas NO deberian pagar y generando problemas a desarrolladores y consultores que realmente optamos por aprovechar todos los recursos de ambas partes (Cliente-Servidor).

Saludos.

Fantasmitta
28/08/2008

Por lo que veo aquí hay mucha gente que le vale un pepino como hacer las cosas, por ese tipo de gente he tenido muchos problemas cuando hago reingenieria de procesos para bases de datos y código duro.

Ojalá aprendieran a optimizar sus desarrollos y dejar que ciertas acciones las realice el servidor y ciertas acciones el cliente.

Si no saben lo que es programar en CAPAS entonces realmente están haciendo trabajo que sus empresas NO deberian pagar y generando problemas a desarrolladores y consultores que realmente optamos por aprovechar todos los recursos de ambas partes (Cliente-Servidor).

Saludos.

Fantasmitta
28/08/2008

JAMES

El problema NO consiste en SQL Server, la cosa está en la capa de Negocio que es cuando extrae la información de la capa de Base de datos (Conexion) y tú decides si sólo lo muestras como Lectura o envias un mensaje en el que le digas al usuario que ya está reservado.

————–
HOLA AMIGOS ESTOY HACIENDO UN PEQUEÑO SISTEMA DE PRESTAMO DE EQUIPOS AUDIOVISUALES NECESITO SU AYUDA. EL PROBLEMA ES EL SIGUIENTE TENGO UNA TABLA PRESTAMOS DONDE TENGO LOS CAMPOS NOMBREEQUIPO, FECHAUSO, HORAUSO, FECHAFINAL, HORAFINAL. EL CHISTE ES NO SE PERMITA QUE SI UN EQUIPO YA ESTA RESERVADO A LA HORA INDICA Y FECHA NO PERMITA QUE SE PUEDA RESERVAR Y QUE VERIFIQUE LAS HORAS Y FECHAS DISPONIBLES.. NO SE SI ME EXPLIQUE.

Camilo
20/10/2008

Amigos… se que los cursores son muy malos.. y por eso tengo una consulta, tengo que hacer un insert de una consulta algo complicada que ya he resuelto en 99%, pero tengo un campo correlativo que se calcula, y ademas de sebe incrementar en una tabla de variables que tengo, para hacerlo corto es algo como Select crr from tx luego update crr + 1, solo que es varchar lo que lo vuelve complicado y nos se puede solo sumar, sino sacar cuantas con el mes, dia, unas letras y al final un numero, si inserto 3 registros deberia ser (ej) el primero a1, segundo a2, tercero a3, dado que hago un update, no puedo usar una funcion (estoy casi seguro de ello), solo creo que me quedan dos opciones, o cursores, o un select que se lo paso a la aplicacion luego inserto linea por linea y en el sp calcularia cada vez ese correlativo, que recomiendan?

yoyo
3/11/2008

alguien sabe como hacer para obtener la suma de registros mas el valor anterior? me explico

reg1 reg2 saldo
20….30…50
10…-20…40
90….10..140

com ven, el saldo no es el resultado de la suma de reg1+reg2 sin que es reg1+reg2+saldoanterior

pero como calcular el saldo sin usar cursores? (que recien me entero por este articulo) y sin hacerlo en la aplicacion (ejecutable) sino en la bd

Juanky
28/11/2008

Los cursores de sql, es una opcion que hay que usar como ULTIMO RECURSO, cuando realizamos una ddbb para miles de usuarios el resultado de usar cursores es tener una maquina sin recursos para los usuarios despues empezamos a tener bloqueos cada vez frecuentes y por ultimo es: “yo tengo lo que tu quieres y yo tengo lo que tu tienes” solucion que da el server elimina la conexione que tenga menos recursos.

Yo no recomiendo usar cursores nunca (ecepto para muy pocos usuarios o en contadisimas ocasiones).

Un saludo.

carlos arjona
10/06/2009

ME GUSTARIA SABER LO MISMO QUE PREGUNTA YOYO, TENGO UN SISTEMA DE FUNERARIA Y DESEO AGREGARLE EL SALDO ACTUALIZADO CADA MES A LOS SOCIOS. ADEMAS OTRA COSA, EL CURSOR ME FUNCIONA A LA PERFECCION PERO EN EL MISMO EDITOR DE SQL SEVER. DONDE TENDRIA QUE UTILIZARLO Y CUAL SERIA LA SINTAXIS (SERIA EN UN PROCEDIMIENTO ALMACENADO, EN UNA FUNCION O EN QUE??) MUCHAS GRACIAS

no entendi nada
que son los cursores?
estamos hablando de la conputadora ehh

la verdad no entendi un carajo

José Ariel
25/07/2009

perfecto este me ayudo mucho ya que estaba buscando algo paresido para poder hacer un estoreprocedure que me jenerara los clientes cuyo codigos eran primo, y necesitaba llenar un cursor con los codigos.
asi que esto con unas modificasiones me fue de gran ayuda.
gracias….

rene
30/07/2009

Muy practico TNX

poncho
16/08/2009

gracias muy bueno !!!!!

Fernando
18/11/2009

Les cuento una experiencia con el tema. Nosotros manejamos grandes cantidades de datos, en SQL2005 en una maquina paralela de 4 CPUs.
El problema era un requerimiento para chequear valores contradictorios no textuales en ciertos campos, en tablas de mas de 20.000.000 de registros, borrar los afectados e insertarlos en otra tabla. El store procedure original se hizo usando un CURSOR(inocentemente). El proceso tardaba 12 dias en correr.
Luego de un poco de reingenieria se paso a updates e inserts masivos usando variables TABLE y selecciones con WITH. El proceso tarda ahora 6 horas. Eso si, hace falta mucho espacio en disco para que SQL despliegue las tablas temporales para este tipo de updates/inserts masivos. Pero vale la pena.

Es un tema muy interesante, ya que define la velocidad del proceso de datos. Sería bueno poder probar el rendimiento de ambas técnicas en paralelo.

jess
2/12/2009

hola. tengo una tabla de Provincias(idProvincia, nombre) otra de viviendas (entre otras cosas idProvincia) los datos los tengo que pasar desde un archivo de excel que trae el nombre de la provincia, no el id.
necesito que al momento de insertar en la tabla provincias sacando los datos del excel me asigne el id y no el nombre.
la unica solucion que encontre fue usando un cursor, pero la idea no me agrada. asi que queria saber si se les ocurria alguna mejor
desde ya mil gracias

flipao
10/02/2010

isaias tu flipas, hay cosas que son imposibles si no usas un cursor

Mario Alan
16/02/2010

Haber boludos respondanle a yoyo

yoyo
alguien sabe como hacer para obtener la suma de registros mas el valor anterior? me explico

reg1 reg2 saldo
20….30…50
10…-20…40
90….10..140

com ven, el saldo no es el resultado de la suma de reg1+reg2 sin que es reg1+reg2+saldoanterior

pero como calcular el saldo sin usar cursores? (que recien me entero por este articulo) y sin hacerlo en la aplicacion (ejecutable) sino en la bd

luis
9/03/2010

sasad

Luis
9/03/2010

Hola estimados, primero que todo quería felicitarlos por el foro que me ha ayudado bastante a comprender algunos casos SQL, junto a ello os quiero hacer una consulta, que es un tema que estoy viendo hoy en mi laburo..
Resulta que necesito realizar una especie de consulta para posteriormente copiar esos registros y alojarlos en diferentes tablas… me explico??
Explicaré brevemente mi tema:
A diario debo capturar datos de una BD que está en MS Access, para ello ocupo DTS para importar dicha BD y alojarla en SQl Server, una vez que me crea la BD en Sql Server, debo ver la forma de copiar algunos campos y/o registros para llevarlos a mi BD oficial en SQl Server, pero he intentado de muchos modos sin obtener resultados positivos :(. Favor solicito a UDs. ayuda…
Desde ya muchas gracias.
Saludos desde Chile.-

Carito
26/03/2010

Yo creo que rlivon está muy equivocado, yo no veo nada de difícil al utilizar cursores, creo que te falta algo por eso no entiendes el código de otros. Los curssores no complican el codigo de una BD, es algo tan sencillo como utilizar bucles.
Sí, me parece que los cursores consumen muchos recursos y que en la mayoría de casos no conviene utilizarlos, pero hay situaciones en las que no queda otra.
Sin embargo el aporte de Matías es útil para el que no sabe nada del tema, con este contenido pueden conocer una herramienta más, ya verpan ellos si la utilizan o no.

Gloria
26/04/2010

Hola¡¡ pues estoy comenzando a realizar cursores y pues ya me salen, pero tengo una duda, al terminar el cursor aroja el resultado; hay algun comando o función que evite ver el resultado en pantalla ??

Bueno, según leo todos dicen es malo es malo y es malo, pero no dicen cuando bajo que condiciones y porque son malos.

Si realmente son tan malos como se dice, porque siguen disponibles en las nuevas versiones de SQL Server? por ejemplo en SQL Server 2008, tenemos cursores forward_only, fast_forward, etc.

Ahora si son malos no creen que hace mucho que lo habrían suprimido y no optimizado como lo están haciendo actualmente?.

Sabemos que hay cosas que no se pueden realizar solamente con consultas o subconsultas como dicen muchos y es por eso que existen los cursores.

Jaime
31/05/2010

Los cursores son excelentes. Hay que hacerlos con tareas muy minimas, que se destruyan inmediatamente y pasen valores a otros procedimientos. Como FORD, cada uno su tarea simple y hacemos por montones, asi maximizamos el rendimiento.

Victor
3/06/2010

Se pueden evitar los cursores con T-SQL y SQL Dinamico dentro de un while…. ya lo he trabajado y me da optimos resultados.

Ismael
8/07/2010

Buen dia,
soy unn tanto novato en esto de cuersores y consultas y como leo que usteds tienen conocimientos quiesiera saber si me pueden ayudar.
mi problema es el siguiente:
tengo una tabla la cual tiene cve_alumno,materia,calificacion1,remedial,extra.
el detalle es que tengo que comparar las tres calificaciones y saber cuales la mayor y desplegarla

ejemplo
1001,1,50,70
1001,2,80
1001,3,50,50,80

y tengo que sacar el promedio del alumno tomando solo la calificacion mas alta de la materia, espero que me puedan ayudar.

Juan Pablo
14/07/2010

Hola: se tiene el siguiente caso

articulo serie
A 1111
A 1112
A 1113
B 2221
B 2222

Se desea

articulo CANT_ARTICULO CANT_SERIE
A 1 0
A 1 1
A 1 2
B 2 0
B 2 1

Por favor agradeceria si alguien puede guiarme como sacar ese resultado.

edgar
22/07/2010

Como puedo correr una tabla registro por registro
(como si fuera un cursor)

Jota
28/07/2010

Para quienes estamos iniciando el articulo esta muy bueno me ayudo. Para quienes llevan mas tiempo tienen mucha critica yy poco aporte…. sin no aportan mejor no opinen.

Buen articulo.

ivan
8/09/2010

enserio necesito alluda
es para una taeea antes de las 12

por q me dice que subconsulta arroja mas de una fila

en MYSQL
lo traduje en google

Gazcuy
15/09/2010

Gracias por la explicacion, me sirvio para lo que necesitaba hacer.
Sigan aportando de esta forma que es util para aquellos que no la tenemos tan clara…

Saludos

48