Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Proc.Almacenado con recursividad, cursores...

Estas en el tema de Proc.Almacenado con recursividad, cursores... en el foro de SQL Server en Foros del Web. Buenas chicos, Llevo un largo tiempo ya con este tema y no se me ocurre como hacerlo o ver que hago mal. Tengo una tabla ...
  #1 (permalink)  
Antiguo 16/12/2009, 06:32
 
Fecha de Ingreso: septiembre-2003
Mensajes: 65
Antigüedad: 20 años, 7 meses
Puntos: 0
Proc.Almacenado con recursividad, cursores...

Buenas chicos,

Llevo un largo tiempo ya con este tema y no se me ocurre como hacerlo o ver que hago mal.
Tengo una tabla digamos de estructura donde tengo 2 campos (llamemosles padre e hijo) y de la cual quiero saber la estructura de un plano que yo le diga.
Este plano lo extraigo de una Select en la cual utilizo 3 tablas diferentes, entre las que se encuentra la tabla de estructuras.

Os dejo el codigo del procedimiento...

ALTER PROCEDURE dbo.Cods_Realizados2
(
@idProv int,
@cod varchar(15)
)
AS
BEGIN

SET NOCOUNT ON;

DECLARE cursor1 CURSOR GLOBAL FOR (SELECT distinct c.es020
FROM faprcpe a, faprlpe b, fproest c
WHERE c.es999=1
and a.cp010=b.lp010 and c.padre=@cod
and a.cp020=@idProv)

OPEN cursor1
fetch next from cursor1
into @cod

WHILE @@fetch_status=0
begin

EXEC dbo.Cods_Realizados2 @idProv,@cod
fetch next from cursor1 into @cod
end

CLOSE cursor1
DEALLOCATE cursor1

END
GO


Este procedimiento lo ejecuto desde otro porque necesito ver los resultados y desde este mismo no se como se haria.
El caso es que la llamada simplemente es
exec dbo.Cods_Realizados2 170,64101055

El error que me aparece es que el cursor con nombre cursor2 ya existe y que ya esta abierto.

La pregunta seria, ¿como puedo extraer la estructura de un codigo en la que puede haber más padres dentro de la propia estructura?

A ver si alguien me puede hechar una manita... mil gracias chicos.
  #2 (permalink)  
Antiguo 16/12/2009, 08:18
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Proc.Almacenado con recursividad, cursores...

que version de sql utilizas?


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 16/12/2009, 10:13
 
Fecha de Ingreso: septiembre-2003
Mensajes: 65
Antigüedad: 20 años, 7 meses
Puntos: 0
Respuesta: Proc.Almacenado con recursividad, cursores...

SQL Server 2005 SP2
  #4 (permalink)  
Antiguo 16/12/2009, 12:11
 
Fecha de Ingreso: noviembre-2006
Ubicación: México
Mensajes: 866
Antigüedad: 17 años, 5 meses
Puntos: 8
Respuesta: Proc.Almacenado con recursividad, cursores...

Hola.

Dentro de las propiedades de tus base de datos en la parte de opciones hay una que se llama Default Cursor, selecciona Local y listo.

Saludos.
  #5 (permalink)  
Antiguo 17/12/2009, 02:05
 
Fecha de Ingreso: septiembre-2003
Mensajes: 65
Antigüedad: 20 años, 7 meses
Puntos: 0
Respuesta: Proc.Almacenado con recursividad, cursores...

Gracias por responder lo primero... me ayuda al menos a seguir buscando.

Ahora no me da ningun error pero no me muestra datos, "sabeis que puedo hacer para que me devuelva o muestre datos?

He estado buscando acerca del cursor output (o varying) y tal pero no he dado con nada en claro...

Mil gracias otra vez.
  #6 (permalink)  
Antiguo 17/12/2009, 02:34
 
Fecha de Ingreso: septiembre-2003
Mensajes: 65
Antigüedad: 20 años, 7 meses
Puntos: 0
Respuesta: Proc.Almacenado con recursividad, cursores...

He seguido buscando por otros lados y me ha llevado a usar WITH CTE que parece mas enfocado a la recursividad y mejor que los cursores... os dejo el codigo:

ALTER PROCEDURE dbo.Cods_Realizados3
(
@idProv int = 10004,
@cod varchar(15)
)
AS
BEGIN

SET NOCOUNT ON;


WITH prueba(es020) AS (SELECT distinct CONVERT(varchar(40),c.es020)
FROM faprcpe a, faprlpe b, fproest c
WHERE a.cp000=1 and b.lp000=1 and c.es999=1
and a.cp010=b.lp010 and c.es000=@cod
and a.cp020=@idProv and a.cp050>'16/12/08'
UNION ALL
SELECT CONVERT(varchar(40), REPLICATE('| ', c.es020))
FROM faprcpe a, faprlpe b, fproest c, prueba d
WHERE a.cp000=1 and b.lp000=1 and c.es999=1
and a.cp010=b.lp010 and a.cp020=@idProv and a.cp050>'16/12/08'
and d.es020=@cod)

SELECT * FROM prueba

END
GO


Ahora si que veo datos y van por buen camino, lo que no hace es entrar por los diferentes niveles... es decir, solo me saca hijos y no nietos por decirlo de alguna manera... me explico?

Alguna sugerencia?... Gracias!!
  #7 (permalink)  
Antiguo 17/12/2009, 09:26
 
Fecha de Ingreso: septiembre-2003
Mensajes: 65
Antigüedad: 20 años, 7 meses
Puntos: 0
Respuesta: Proc.Almacenado con recursividad, cursores...

Bueno, tras investigar, probar, probar y probar... he llegado a lo que queria, pero con un PERO...

Os dejo el codigo del With..

WITH prueba(padre,hijo) AS (SELECT distinct c.padre,c.hijo
FROM faprcpe a, faprlpe b, fproest c
WHERE a.cp000=1 and b.lp000=1 and c.es999=1
and a.cp010=b.lp010 and c.padre=@cod
and a.cp020=@idProv and a.cp050>'16/12/08'
UNION ALL
SELECT c.padre, c.hijo
FROM faprcpe a, faprlpe b, fproest c, prueba d
WHERE a.cp000=1 and b.lp000=1 and c.es999=1
and a.cp010=b.lp010 and a.cp020=@idProv and a.cp050>'16/12/08'
and d.hijo=c.padre)

SELECT distinct padre,hijo FROM prueba
ORDER BY espadre,hijo


El problema es que le cuesta sacarme una estructura de 6 registros... 2 minutos!!
Veis algo raro que pueda simplificar y acortar este tiempo?

Gracias!
  #8 (permalink)  
Antiguo 17/12/2009, 10:00
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Proc.Almacenado con recursividad, cursores...

puedes intentar con inner joins en lugar de producto cartesiando...a excepcion de la tabla fproest que no le hallo relacion directa con las otras 2... por eso la inclui con un cross join..

Adicional, el tener indices en los campos que hacen los joins seria muy bueno para el performance...

espero te sea de utilidad..

Código:
WITH prueba(padre,hijo) AS 
(
SELECT     c.padre,
           c.hijo
FROM       faprcpe a
INNER JOIN faprlpe b 
ON         a.cp020 = @idProv   AND
           a.cp000 = 1         AND
           a.cp050>'16/12/08'  AND
           b.lp000 = 1  
           a.cp010 = b.lp010
CROSS JOIN fproest c 
WHERE      c.es999 = 1 and 
           c.padre = @cod
GROUP BY   c.padre,
           c.hijo 
UNION ALL
SELECT     c.padre, 
           c.hijo
FROM       faprcpe a
INNER JOIN faprlpe b
ON         a.cp020 = @idProv     AND
           a.cp000 = 1           AND 
           a.cp050 > '16/12/08'  AND
           b.lp000 = 1           AND
           a.cp010 = b.lp010
CROSS JOIN fproest c
INNER JOIN prueba d
           d.hijo  = c.padre
WHERE      c.es999 = 1
GROUP BY   c.padre,
           c.hijo
)

SELECT     padre,
           hijo 
FROM       prueba
ORDER BY   padre,
           hijo
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #9 (permalink)  
Antiguo 17/12/2009, 10:47
 
Fecha de Ingreso: septiembre-2003
Mensajes: 65
Antigüedad: 20 años, 7 meses
Puntos: 0
De acuerdo Respuesta: Proc.Almacenado con recursividad, cursores...

Gracais Andres,

He probado tu codigo y hace algo similar al mio pero tambien le cuesta.
He optado por extraer la estructura unicamente de la tabla que necesito y despues ya comprobare en las otras tablas los parametros que tengo que comprobar.

Mas que nada porque asi creo que se esta haciendo un embrollo de cosas el mismo y es posible que le cueste por las operaciones internas que hace.

De todos modos, como te digo, gracias por ayudarme.... hoy podremos decir (otra vez) que no nos metemos en la cama sin saber algo nuevo

Saludos!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:40.