Newsgroup: it.comp.software.database
Titolo: [SQLSERVER7] - stored procedure ricorsiva

su sqlserver 7 non esistono le functions. mi confermate?
la mia necessità è quella di creare una stored procedure che, a partire da 
una foglia di un albero (classica struttura {id, id_padre, nome}), mi 
restituisca il path.
es:
id      id_padre        nome
1       0               ciccio
2       1               pippo
3       0               bau
4       2               miao
dovrei avere una SP che dato in input 4 mi restituisca
ciccio -> pippo -> miao  (stringa, non records differenti!)
non sono riuscito a giostrarmi con varie exec / select into.
questo è quanto ho fatto finora (che non funzica):
CREATE PROCEDURE show_path (@id_nodo int)
AS
BEGIN
  DECLARE cursore CURSOR FOR select id_padre,nome from albero where 
id=@id_nodo;
  DECLARE @padre varchar(500);
  DECLARE @id_padre int;
  DECLARE @nome varchar(100);
        open cursore
        fetch next from cursore into @id_padre, @nome
        close cursore
        deallocate cursore
        if @id_padre > 0
                begin
                exec @padre = show_path @id_padre --che cacchio  ci metto??
                print @padre --torna 0
                --select show_path @id_padre into @padre -- da errore
                select 'path' =  @padre + ' -> ' + @nome
                end
        else
                begin
                select 'path' = @nome
                end
end
GO
se lancio, adesso mi ritorna 1 record per livello, ovviamente il @padre, di 
volta in volta assume una integer-expression che mi fa girar le balle.
idee??
non posso upgradare, non posso cambiare db (è la prima cosa che avrei fatto 
ma le scelte aziendali a volte sono molto discutibili!!)
mi consigliate di farlo a livello di applicazione o c'è qualche truschino?
transact-sql di m****!!
grazie
ciao
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.gnu.org/philosophy/motivation.it.html

 transact-sql di m****!!
concordo pienamente!!!
posto l'algoritmo iterativo, casomai servisse un giorno a qualcuno.
CREATE PROCEDURE show_path (@id_nodo int)
AS
BEGIN
 
  DECLARE @totale varchar(500);
  DECLARE @id_padre int;
  DECLARE @nome varchar(100);
SET @totale = '';
SET @nome = '';
         DECLARE cursore CURSOR FOR select id_padre,nome from albero where 
id=@id_nodo;
        open cursore
        fetch next from cursore into @id_padre, @nome
        close cursore
        deallocate cursore
        SET @totale=@nome
        while @id_padre != 0
                begin
                SET @id_nodo = @id_padre;
                DECLARE cursore CURSOR FOR select id_padre,nome from albero
                where id=@id_nodo;
                open cursore
                fetch next from cursore into @id_padre, @nome
                close cursore
                deallocate cursore
                SET @totale=@nome + ' -> ' + @totale;
                end
print @totale
end
GO
ciao
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.gnu.org/press/2002-04-11-ms-patent.html

 un resultset (parlando sempre di sql7)
La SP può ritornarare qualsiasi tipo di dato predefinito, compreso un
resultset

Ok .. la logica è giusta, anche se non capisco perchè fai quel lavoraccio di
cursori ..
per ricavare un elemento ti basta una select, non è necessario aprire un
cursore (che tra le altre cose è pesantino)
DECLARE @totale varchar(500);
DECLARE @id_padre int;
DECLARE @nome varchar(100);
 SET @totale = '';
SET @nome = '';
SET @ID_Padre = 0
WHILE @id_Padre => 0
    begin
    SELECT TOP 1 @id_padre = Id_padre, @nome = Nome
    FROM Albero
    WHERE id = @Id_nodo
    Set @Totale = @nome + ' -> ' + @Totale
    @id_nodo = @id_Padre
    if @id_padre = 0  SET @id_padre = -1
    end
Saluti


ehehe...
io ho sputato sangue una volta per un problema del genere...
come l'ho risolto?
non l'ho risolto... o meglio l'ho risolto in un altro strato
dell'applicazione...
lo scenario era il seguente... pagina web con voci di menù
ricorsive... tabella con le voci di menu referenziata a se
stessa...
i tempi erano stretti quindi a onor del vero non ci mettemmo
a romperci troppo sulla SP di sql...
ma in realtà esiste il Data shaping in ADO che ti fa quello
che vuoi... le SP le usammo esclusivamente come una sorta di
wrapper evoluto per evitare di fare select direattamente dalle
pagine ASP...
/G

     WHERE id = @Id_nodo
az. adesso che lo so aggiusto fin dove sono arrivato, grazie!
io cercavo una select into, non una select e basta...
machecavolo!
ciao
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.php.net

 dell'applicazione...
io sono costretto a risolverlo nel db.
sul db che ho disegnato, andranno ad appoggiarsi almeno un paio di siti e 
(forse nel futuro prossimo) anche un paio di applicazioni in VB.
quindi, per stare a riscrivere tutta la logica a livello appl, tanto vale 
sbattersi e far funzionare le cose direttamente su db!
comunque ho risolto il problema, anche se in modo poco ortodosso 
(consigliato da msde, mah!)
ciao
-- 
Punkarruso
mail:punkarruso chiocchiolona despammed punto com
pubblicità progresso:
http://www.nist.gov/dads/