Problema con Cursor

19/08/2004 - 05:05 por ChAtEiToR | Informe spam
Estimados,
Tengo un SP (p1) que tiene 2 cursores (los abre y luego
los cierra y libera), al final del SP, llama a otro SP
(sp2) que a su vez realiza una serie de procesos y crea
otro cursor, en éste último por alguna extraña razón no
entra al cursor, el FETCH_STATUS siempre está en -1,
incluso le puse un print del status al entrar al SP (sp2),
antes de hacer nada, ni siquiera creado el nuevo cursor y
ya cerrado y liberado los anteriores, y ya viene con el
valor -1, como tengo un While @@Fetch_Status = 0 nunca
entra. Esto me esta sucediendo desde que se realizó una
actualización al servidor, antes de eso me funcionaba
perfectamente. Existe alguna forma de Resetear los valores
del Fetch Status o limpiarlo?, hay que setear algo
especial en el server para que corra?, cuál puede ser el
problema?
PD: El select que realizo SIEMPRE me devuelve datos, por
lo tanto el cursor nunca es BOF o EOF.

Espero sus comentarios.
Saludos.
Cristian.

Preguntas similare

Leer las respuestas

#1 Maxi
19/08/2004 - 14:18 | Informe spam
Hola, bueno primero estamos ante un gran problema: EL uso de cursores!!!

SqlServer no esta pensado y mucho menos optimizado para trabajar con
cursores, hay que tratar de trabajar con conjunto de datos y no registro a
registro :-)

Esto es muy comun cuando un desarrollador empieza a programar en Sql y
piensa que es lo mismo que en VB por ej!!

Bue hay que cambiar un poco la forma de pensar asi los procesos que hagamos
dentro del Sql puedan ser lo mas optimos posibles :-)

Porque no nos cuentas que buscas hacer y no como lo queres hacer, y te puedo
decir que muchos aqui estaran muy dispuestos a ayudarte y mucho mas a
eliminar un cursor :-)


Salu2
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"ChAtEiToR" escribió en el mensaje
news:8eae01c48599$6a37d170$
Estimados,
Tengo un SP (p1) que tiene 2 cursores (los abre y luego
los cierra y libera), al final del SP, llama a otro SP
(sp2) que a su vez realiza una serie de procesos y crea
otro cursor, en éste último por alguna extraña razón no
entra al cursor, el FETCH_STATUS siempre está en -1,
incluso le puse un print del status al entrar al SP (sp2),
antes de hacer nada, ni siquiera creado el nuevo cursor y
ya cerrado y liberado los anteriores, y ya viene con el
valor -1, como tengo un While @@Fetch_Status = 0 nunca
entra. Esto me esta sucediendo desde que se realizó una
actualización al servidor, antes de eso me funcionaba
perfectamente. Existe alguna forma de Resetear los valores
del Fetch Status o limpiarlo?, hay que setear algo
especial en el server para que corra?, cuál puede ser el
problema?
PD: El select que realizo SIEMPRE me devuelve datos, por
lo tanto el cursor nunca es BOF o EOF.

Espero sus comentarios.
Saludos.
Cristian.



Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.740 / Virus Database: 494 - Release Date: 17/08/2004
Respuesta Responder a este mensaje
#2 Javier Loria
19/08/2004 - 15:10 | Informe spam
Hola:
Aparte de recomerdarte que leas el acertado comentario de Max, el
alcance de los cursores es de forma predeterminada LOCAL de manera que son
"invisibles" para los demas procedimientos.
Lo que quieres es cambiar el declare de forma:
DECLARE OdioLosCursores
CURSOR GLOBAL
FOR SELECT FROM .
= Esto deberia funcionarte. Debes tener MUCHO cuidado ya que le Local
existe para tu proteccion, cuando defines un cursor como Global entonces se
mantiene para la conexion, si se te olvida hacerle DEALLOCATE solo hasta que
se cerrar la conexion sera removido.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda


"ChAtEiToR" wrote in message
news:8eae01c48599$6a37d170$
Estimados,
Tengo un SP (p1) que tiene 2 cursores (los abre y luego
los cierra y libera), al final del SP, llama a otro SP
(sp2) que a su vez realiza una serie de procesos y crea
otro cursor, en éste último por alguna extraña razón no
entra al cursor, el FETCH_STATUS siempre está en -1,
incluso le puse un print del status al entrar al SP (sp2),
antes de hacer nada, ni siquiera creado el nuevo cursor y
ya cerrado y liberado los anteriores, y ya viene con el
valor -1, como tengo un While @@Fetch_Status = 0 nunca
entra. Esto me esta sucediendo desde que se realizó una
actualización al servidor, antes de eso me funcionaba
perfectamente. Existe alguna forma de Resetear los valores
del Fetch Status o limpiarlo?, hay que setear algo
especial en el server para que corra?, cuál puede ser el
problema?
PD: El select que realizo SIEMPRE me devuelve datos, por
lo tanto el cursor nunca es BOF o EOF.

Espero sus comentarios.
Saludos.
Cristian.
Respuesta Responder a este mensaje
#3 ChAtEiToR
19/08/2004 - 15:29 | Informe spam
Gracias Maxi por responder.

Entiendo que quizas SQL no está optimizado para trabajar
con cursores, pero por algo existen no?, según lo que he
leido, MS recomienda "EVITAR" el uso de cursores,
probablemente exista una solución mas optima para mi
problenma y así "EVITAR" el uso de cursores. Bueno, pero
el motivo de mi pregunta no es esa discutir o no el uso de
cursores, agradezco de todas formas tu consejo, lo tendré
en cuenta.

En una BD tengo N grupos creados, obviamente con distintos
usuarios en cada grupo, éstos grupos tiene permiso
de "Select" a ciertos SP's (Antes eran los usuarios
quienes tenían permiso drecto sobre las tablas .. BAD!!).
A traves de una aplicación VB administro los grupos y le
asocio sus usuarios, pero ademas de eso administra los
permisos o accesos a ciertas funcionalidades del sistema.
Lo que hace el cursor dar permiso de "Select" al grupo a
cada SP que tenga relación con las funcionalidades que el
grupo posee. El tema no es fácil de entender, pero en
resumen el cursos se pasea por cada funcionalidad a la que
tiene acceso al grupo, por cada una de ellas saca un
listado de SP y da permiso de "Select" por cada SP al
grupo. Gráficamente sería algo asi.

Listado de Roles
Listado de Funciones por Rol
Listado de SP por función
grant execute on ' + NombreSP +' to ' + NombreRol
Fin Sp
Fin Listado Funciones
Fin Roles

Como dije en el post anterior, éste SP es llamado desde
otro, pero estuve testeando el @@Fetch_Status y al entrar
a éste SP el Estado ya viene con -1, por lo tanto nunca
ejecuta el "Grant"

Ojala se entienda algo, espero sus comentarios, desde ya
muchas gracias.

Saludos.
Cristian.

Hola, bueno primero estamos ante un gran problema: EL uso


de cursores!!!

SqlServer no esta pensado y mucho menos optimizado para


trabajar con
cursores, hay que tratar de trabajar con conjunto de


datos y no registro a
registro :-)

Esto es muy comun cuando un desarrollador empieza a


programar en Sql y
piensa que es lo mismo que en VB por ej!!

Bue hay que cambiar un poco la forma de pensar asi los


procesos que hagamos
dentro del Sql puedan ser lo mas optimos posibles :-)

Porque no nos cuentas que buscas hacer y no como lo


queres hacer, y te puedo
decir que muchos aqui estaran muy dispuestos a ayudarte y


mucho mas a
eliminar un cursor :-)


Salu2
-


-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
-


-
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"ChAtEiToR"


escribió en el mensaje
news:8eae01c48599$6a37d170$
Estimados,
Tengo un SP (p1) que tiene 2 cursores (los abre y luego
los cierra y libera), al final del SP, llama a otro SP
(sp2) que a su vez realiza una serie de procesos y crea
otro cursor, en éste último por alguna extraña razón no
entra al cursor, el FETCH_STATUS siempre está en -1,
incluso le puse un print del status al entrar al SP (sp2),
antes de hacer nada, ni siquiera creado el nuevo cursor y
ya cerrado y liberado los anteriores, y ya viene con el
valor -1, como tengo un While @@Fetch_Status = 0 nunca
entra. Esto me esta sucediendo desde que se realizó una
actualización al servidor, antes de eso me funcionaba
perfectamente. Existe alguna forma de Resetear los valores
del Fetch Status o limpiarlo?, hay que setear algo
especial en el server para que corra?, cuál puede ser el
problema?
PD: El select que realizo SIEMPRE me devuelve datos, por
lo tanto el cursor nunca es BOF o EOF.

Espero sus comentarios.
Saludos.
Cristian.



Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.740 / Virus Database: 494 - Release Date:


17/08/2004


.

Respuesta Responder a este mensaje
#4 ChAtEiToR
19/08/2004 - 15:37 | Informe spam
Hola Javier, tanto tiempo, ni debes acordarte de mi,
Gracias por responder.

Lo que quiero es presisamente que no pase de un SP a otro,
estuve revisando las dboption y está conf de forma
predeterminada como LOCAL. El drama es, que por algún
extraño motivo el @@FETCH_STATUS llega al 2do SP con el
valor -1, puse un print del estado y antes de hacer nada
ya viene con dicho valor. Como dije el Select "Siempre"
devuelve algo, por lo tanto el Open del cursor debería
realizarse y el Status estar en 0, pero como decía, a
penas entra al SP el Status se mantiene en -1

Help please!!!...

Saludos.
Cristian.


Hola:
Aparte de recomerdarte que leas el acertado


comentario de Max, el
alcance de los cursores es de forma predeterminada LOCAL


de manera que son
"invisibles" para los demas procedimientos.
Lo que quieres es cambiar el declare de forma:
DECLARE OdioLosCursores


CURSOR GLOBAL
FOR SELECT FROM .
=> Esto deberia funcionarte. Debes tener MUCHO cuidado


ya que le Local
existe para tu proteccion, cuando defines un cursor como


Global entonces se
mantiene para la conexion, si se te olvida hacerle


DEALLOCATE solo hasta que
se cerrar la conexion sera removido.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda


"ChAtEiToR" wrote


in message
news:8eae01c48599$6a37d170$
Estimados,
Tengo un SP (p1) que tiene 2 cursores (los abre y luego
los cierra y libera), al final del SP, llama a otro SP
(sp2) que a su vez realiza una serie de procesos y crea
otro cursor, en éste último por alguna extraña razón no
entra al cursor, el FETCH_STATUS siempre está en -1,
incluso le puse un print del status al entrar al SP (sp2),
antes de hacer nada, ni siquiera creado el nuevo cursor y
ya cerrado y liberado los anteriores, y ya viene con el
valor -1, como tengo un While @@Fetch_Status = 0 nunca
entra. Esto me esta sucediendo desde que se realizó una
actualización al servidor, antes de eso me funcionaba
perfectamente. Existe alguna forma de Resetear los valores
del Fetch Status o limpiarlo?, hay que setear algo
especial en el server para que corra?, cuál puede ser el
problema?
PD: El select que realizo SIEMPRE me devuelve datos, por
lo tanto el cursor nunca es BOF o EOF.

Espero sus comentarios.
Saludos.
Cristian.


.

Respuesta Responder a este mensaje
#5 Javier Loria
20/08/2004 - 02:36 | Informe spam
Hola:
Dejame hacer algunas pruebas a ver si puedo duplicar el problema.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"ChAtEiToR" wrote in message
news:8e2d01c485f1$9cdc1ca0$
Hola Javier, tanto tiempo, ni debes acordarte de mi,
Gracias por responder.

Lo que quiero es presisamente que no pase de un SP a otro,
estuve revisando las dboption y está conf de forma
predeterminada como LOCAL. El drama es, que por algún
extraño motivo el @@FETCH_STATUS llega al 2do SP con el
valor -1, puse un print del estado y antes de hacer nada
ya viene con dicho valor. Como dije el Select "Siempre"
devuelve algo, por lo tanto el Open del cursor debería
realizarse y el Status estar en 0, pero como decía, a
penas entra al SP el Status se mantiene en -1

Help please!!!...

Saludos.
Cristian.


Hola:
Aparte de recomerdarte que leas el acertado


comentario de Max, el
alcance de los cursores es de forma predeterminada LOCAL


de manera que son
"invisibles" para los demas procedimientos.
Lo que quieres es cambiar el declare de forma:
DECLARE OdioLosCursores


CURSOR GLOBAL
FOR SELECT FROM .
=> Esto deberia funcionarte. Debes tener MUCHO cuidado


ya que le Local
existe para tu proteccion, cuando defines un cursor como


Global entonces se
mantiene para la conexion, si se te olvida hacerle


DEALLOCATE solo hasta que
se cerrar la conexion sera removido.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda


"ChAtEiToR" wrote


in message
news:8eae01c48599$6a37d170$
Estimados,
Tengo un SP (p1) que tiene 2 cursores (los abre y luego
los cierra y libera), al final del SP, llama a otro SP
(sp2) que a su vez realiza una serie de procesos y crea
otro cursor, en éste último por alguna extraña razón no
entra al cursor, el FETCH_STATUS siempre está en -1,
incluso le puse un print del status al entrar al SP (sp2),
antes de hacer nada, ni siquiera creado el nuevo cursor y
ya cerrado y liberado los anteriores, y ya viene con el
valor -1, como tengo un While @@Fetch_Status = 0 nunca
entra. Esto me esta sucediendo desde que se realizó una
actualización al servidor, antes de eso me funcionaba
perfectamente. Existe alguna forma de Resetear los valores
del Fetch Status o limpiarlo?, hay que setear algo
especial en el server para que corra?, cuál puede ser el
problema?
PD: El select que realizo SIEMPRE me devuelve datos, por
lo tanto el cursor nunca es BOF o EOF.

Espero sus comentarios.
Saludos.
Cristian.


.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida