Funcion Recursiva

02/09/2003 - 04:05 por Carlos | Informe spam
Hola amigos del Foro, ire a mi pregunta:

Tengo una tabla como esta:

Id_Tabla | Cod_Fila | Id_Padre
-
10 | 05 | null
20 | 13 | 10
30 | 04 | 20

estoy tratando de desarrollar una funcion que me devuelva:
05.13.04 es decir la concatenacion del campo: Cod_Fila

a esta funcion le pasaria como parametro el Id_Tabla
por ejemplo:
fCodUbicacion (@Id_Tabla) = fCodUbicacion (30)

y que vaya llamandose con el identificador padre (campo: Id_Padre) y
concatenandose hasta que al final encuentre el valor Id_Padre = null y
termine el proceso

Espero su ayuda, gracias de antemano

Preguntas similare

Leer las respuestas

#1 Gustavo Larriera [MVP]
02/09/2003 - 04:53 | Informe spam
Es un problema muy interesante, una clausura transitiva con las que suelen
castigar en los cursos de teoria de bases de datos :-)

Si bien T-SQL no es un lenguaje recursivo en sentido estricto, un stored
procedure puede invocarse recursivamente (con un tope máximo de 32
invocaciones recursivas , controlar con @@NESTLEVEL).

Pero las clausuras transitivas tienen varios algoritmos no-recursivos muy
adecuados que pueden implementarse en T-SQL.

Voy a ver si puedo traer un buen ejemplo.

Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm

This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.


"Carlos" wrote in message
news:ut$
Hola amigos del Foro, ire a mi pregunta:

Tengo una tabla como esta:

Id_Tabla | Cod_Fila | Id_Padre
-
10 | 05 | null
20 | 13 | 10
30 | 04 | 20

estoy tratando de desarrollar una funcion que me devuelva:
05.13.04 es decir la concatenacion del campo: Cod_Fila

a esta funcion le pasaria como parametro el Id_Tabla
por ejemplo:
fCodUbicacion (@Id_Tabla) = fCodUbicacion (30)

y que vaya llamandose con el identificador padre (campo: Id_Padre) y
concatenandose hasta que al final encuentre el valor Id_Padre = null y
termine el proceso

Espero su ayuda, gracias de antemano


Respuesta Responder a este mensaje
#2 Carlos Sacristan
02/09/2003 - 08:22 | Informe spam
Probablemente no sea la forma más eficiente de recursividad, pero puedes
echar un vistazo al tema 'Expandir jerarquías' de los BOL. Ahí viene un
ejemplo de mostrar la jerarquía de los países ordenadamente



Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro

Se agradece la inclusión de sentencias DDL

Archivo de respuestas anteriores en:
http://groups.google.com/groups?hl=....public.es
.sqlserver

(Guía de netiquette del foro)
http://www.helpdna.net/bosqlfaq00.htm
http://perso.wanadoo.es/rubenvigon/foro

(FAQ's de SQL Server)
http://support.microsoft.com/defaul.../70faq.asp
http://www.helpdna.net/bosqlfaq.htm

"Carlos" escribió en el mensaje
news:ut$
Hola amigos del Foro, ire a mi pregunta:

Tengo una tabla como esta:

Id_Tabla | Cod_Fila | Id_Padre
-
10 | 05 | null
20 | 13 | 10
30 | 04 | 20

estoy tratando de desarrollar una funcion que me devuelva:
05.13.04 es decir la concatenacion del campo: Cod_Fila

a esta funcion le pasaria como parametro el Id_Tabla
por ejemplo:
fCodUbicacion (@Id_Tabla) = fCodUbicacion (30)

y que vaya llamandose con el identificador padre (campo: Id_Padre) y
concatenandose hasta que al final encuentre el valor Id_Padre = null y
termine el proceso

Espero su ayuda, gracias de antemano


Respuesta Responder a este mensaje
#3 SqlRanger
02/09/2003 - 11:07 | Informe spam
A la espera de que Gustavo te proporcione la versión iterativa, yo te voy a
poner la función recursiva que es más fácil:

create table Tabla
(
IdTabla int primary key,
CodFila char(2) not null,
IdPadre int null
)

go

insert into Tabla values( 10, '05', null)
insert into Tabla values( 20, '13', 10)
insert into Tabla values( 30, '04', 20)

go

create function Localizacion( @IdTabla int )
returns varchar(50)
as
begin

declare @Localizacion varchar(50), @CodFila char(2), @IdPadre int

select @CodFila = CodFila, @IdPadre = IdPadre
from Tabla
where IdTabla = @IdTabla

if @IdPadre is null
set @Localizacion = @CodFila
else
set @Localizacion = dbo.Localizacion( @IdPadre ) + '.' + @CodFila
return @Localizacion
end

go

select dbo.Localizacion(30)

go



Saludos:

Jesús López
MVP Microsoft .NET
MCP SQL Server
"Carlos" escribió en el mensaje
news:ut$
Hola amigos del Foro, ire a mi pregunta:

Tengo una tabla como esta:

Id_Tabla | Cod_Fila | Id_Padre
-
10 | 05 | null
20 | 13 | 10
30 | 04 | 20

estoy tratando de desarrollar una funcion que me devuelva:
05.13.04 es decir la concatenacion del campo: Cod_Fila

a esta funcion le pasaria como parametro el Id_Tabla
por ejemplo:
fCodUbicacion (@Id_Tabla) = fCodUbicacion (30)

y que vaya llamandose con el identificador padre (campo: Id_Padre) y
concatenandose hasta que al final encuentre el valor Id_Padre = null y
termine el proceso

Espero su ayuda, gracias de antemano


Respuesta Responder a este mensaje
#4 SqlRanger
02/09/2003 - 11:25 | Informe spam
Bueno ahí va la versión iterativa de la función:

create function Localizacion2( @IdTabla int )
returns varchar(50)
as
begin

declare @Localizacion varchar(50), @CodFila char(2), @IdPadre int
while 1 = 1
begin

select @CodFila = CodFila, @IdPadre = IdPadre
from Tabla
where IdTabla = @IdTabla
if @Localizacion is null
set @Localizacion = @CodFila
else
set @Localizacion = @CodFila + '.' + @Localizacion
if @IdPadre is null
break
else
set @IdTabla = @IdPadre
end

return @Localizacion
end

go


Es mejor la versión iterativa ya que es más eficiente y además no tiene el
límite de 32 como nivel máximo de anidamiento


Saludos:

Jesús López
MVP Microsoft .NET
MCP SQL Server
Respuesta Responder a este mensaje
#5 Carlos
02/09/2003 - 16:03 | Informe spam
Muchisimas gracias Amigos.
Problema solucionado, se que a varias personas les servira, la solucion que
me han planteado.




"SqlRanger" escribió en el mensaje
news:
Bueno ahí va la versión iterativa de la función:

create function Localizacion2( @IdTabla int )
returns varchar(50)
as
begin

declare @Localizacion varchar(50), @CodFila char(2), @IdPadre int
while 1 = 1
begin

select @CodFila = CodFila, @IdPadre = IdPadre
from Tabla
where IdTabla = @IdTabla
if @Localizacion is null
set @Localizacion = @CodFila
else
set @Localizacion = @CodFila + '.' + @Localizacion
if @IdPadre is null
break
else
set @IdTabla = @IdPadre
end

return @Localizacion
end

go


Es mejor la versión iterativa ya que es más eficiente y además no tiene el
límite de 32 como nivel máximo de anidamiento


Saludos:

Jesús López
MVP Microsoft .NET
MCP SQL Server


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida