Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Funcion Recursiva

42 views
Skip to first unread message

Carlos

unread,
Sep 1, 2003, 10:05:10 PM9/1/03
to
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


underscore g_Larriera@hotmail.com Gustavo Larriera [MVP]

unread,
Sep 1, 2003, 10:53:51 PM9/1/03
to
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" <140...@ing.unmsm.edu.pe> wrote in message
news:ut$h8ePcD...@TK2MSFTNGP10.phx.gbl...

Carlos Sacristan

unread,
Sep 2, 2003, 2:22:51 AM9/2/03
to

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=es&lr=&ie=UTF-8&group=microsoft.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/default.aspx?scid=/support/sql/70faq.asp
http://www.helpdna.net/bosqlfaq.htm

"Carlos" <140...@ing.unmsm.edu.pe> escribió en el mensaje
news:ut$h8ePcD...@TK2MSFTNGP10.phx.gbl...

SqlRanger

unread,
Sep 2, 2003, 5:07:18 AM9/2/03
to
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" <140...@ing.unmsm.edu.pe> escribió en el mensaje
news:ut$h8ePcD...@TK2MSFTNGP10.phx.gbl...

SqlRanger

unread,
Sep 2, 2003, 5:25:04 AM9/2/03
to
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

Carlos

unread,
Sep 2, 2003, 10:03:23 AM9/2/03
to
Muchisimas gracias Amigos.
Problema solucionado, se que a varias personas les servira, la solucion que
me han planteado.


"SqlRanger" <jesusl...@navegalia.com> escribió en el mensaje
news:ekO1RUTc...@TK2MSFTNGP11.phx.gbl...

underscore g_Larriera@hotmail.com Gustavo Larriera [MVP]

unread,
Sep 2, 2003, 11:50:38 AM9/2/03
to
Jesus me has ahorrado el trabajo de buscar una solucion iterativa :-) muy
buen ejemplo, gracias.

--
Gustavo Larriera, MSFT MVP-SQL
Uruguay LatAm
---
This message is provided "AS IS" with no warranties expressed or implied,
and confers no rights.
---

"SqlRanger" <jesusl...@navegalia.com> wrote in message
news:ekO1RUTc...@TK2MSFTNGP11.phx.gbl...

0 new messages