Hallo!

Nur weil es hier schon �fter anders behauptet wurde: Stored Procedures
und User Defined Functions (ab SQL Server 2000) k�nnen verschachtelt
werden, allerdings maximal 32 Ebenen, was f�r die meisten B�ume
ausreichen d�rfte. Wenn man dann mit lokalen oder statischen Variablen
Probleme bekommt, kann man auch die "verz�gerte Namensaufl�sung"
benutzen oder - wenn die Tiefe eines Baums feststeht - mit
hierarchischen Recordsets arbeiten.

Die sichere L�sung f�r alle Baumstrukturen funktioniert mit einer
tempor�ren Tabelle, die als Stack fungiert und dabei alle zu
bearbeitenden Eltern aufnimmt und gleichzeitig die Tiefe festlegt. Zum
Schluss wird der Stack mit der Ausgangstabelle verkn�pft. Man erh�lt
dann ein Recordset komplett mit Einr�ckungen oder Stufennummern f�r die
Hierarchie.

Mehr dazu steht in der Dokumentation zum SQL Server (Inside SQLServer).
Da ich so etwas sehr bald auch ben�tige, mache ich mich mal an die
Arbeit und entwickele ein Beispiel.

Freundliche Gr��e
Joachim van de Bruck



> -----Urspr�ngliche Nachricht-----
> Von: Ralf-Michael Wolf [mailto:[EMAIL PROTECTED]]
> Gesendet: Donnerstag, 18. Oktober 2001 16:35
> An: ASP Datenbankprogrammierung
> Betreff: [aspdedatabase] RE: Feststellen, ob a ein Kind von b ist....
> 
> Hier mal nen anderer Ansatz bei demnur die Daten geholt werden
> Die auch n�tig sind
> 
> <%@ Language=VBScript %>
> <!-- #INCLUDE FILE="global/data.asp" -->
> <%
> Function GetVater(Vater)
>       GetVater=0
>       runsql1(" select * from Tabelle where Kind=" & Kind )'(in diese
> fall 13)
>       if not rs1.eof then
>               'hier den Vater in ein Array schreibe rs("Vater")
>               GetVater=rs1("Vater")
>               end if
>       rs1.close
> End function
> %>
> <html>
> <head>
> </head>
> <%
> 'Hier der Aufruf:
> Vater=13
> while not Vater=0
>       if vater<>0 then
>               Response.write(vater)
>               Response.write("  -  ")
>       end if
>       vater=getvater (0,vater)
> wend
> %>
> </body>
> </html>
> 
> 
> Wobei data.asp und so und den rs aufruf musste noch anpassen...
> 
> Gru�
> 
> ralf
> 
> -----Original2 Message-----
> From: Christoph Biegner [mailto:[EMAIL PROTECTED]]
> Sent: Donnerstag, 18. Oktober 2001 15:39
> To: ASP Datenbankprogrammierung
> Subject: [aspdedatabase] RE: Feststellen, ob a ein Kind von b ist....
> 
> 
> Hallo!
> 
> Ich habe hier einen L=F6sungsansatz mit einer tempor=E4ren Tabelle. =
> Idealerweise w=FCrde man sowas mit rekursion l=F6sen, aber das ist
wohl
> in SQL nicht = m=F6glich.
> Also:
> 
> DROP TABLE dbo.relations
> GO
> DROP procedure dbo.GetRelations
> GO
> create table dbo.relations
> (
>       vater   int     NOT NULL,
>       kind    int     NOT NULL
> )
> GO
> 
> INSERT INTO relations VALUEs(3,7)
> INSERT INTO relations VALUEs(3,8)
> INSERT INTO relations VALUEs(4,9)
> INSERT INTO relations VALUEs(7,12)
> INSERT INTO relations VALUEs(12,13)
> GO
> 
> CREATE procedure dbo.GetRelations
>       @P_child        int
> AS
> 
> SET NOCOUNT ON
> 
> DECLARE       @L_count        int
> DECLARE       @L_count2       int
> 
> CREATE TABLE  #temp
> (
>       relationID      INT     NOT NULL
> )
> 
> INSERT INTO #temp VALUES(@P_child)
> 
> SELECT        @L_count =3D 0
> SELECT        @L_count2 =3D count(*) FROM #temp
> 
> WHILE @L_count < @L_count2
> BEGIN
>       SELECT  @L_count =3D @L_count2
> 
>       INSERT INTO #temp
>       SELECT  vater
>       FROM    relations A
>       INNER JOIN      #temp B ON      A.kind =3D B.relationID
>       LEFT OUTER JOIN #temp C ON      A.vater =3D C.relationID
>       WHERE   C.relationID IS NULL
>       SELECT  @L_count2 =3D count(*) FROM #temp
> END
> 
> SELECT * FROM #temp
> GO
> 
> GetRelations 13
> 
> 
> 
> HTH,
> Christoph
> 
> > -----Original Message-----
> > From: Mayer, Stefan [mailto:[EMAIL PROTECTED]]
> > Sent: Thursday, October 18, 2001 3:23 PM
> > To: ASP Datenbankprogrammierung
> > Subject: [aspdedatabase] Feststellen, ob a ein Kind von b ist....
=20
> >=20
> > ich habe in einer Tabelle Vater-Kind-Beziehungen abgebildet. Wie
kann
> > ich ganz leicht (mit m=F6glichste einer einzigen Abfrage)=20
> > feststellen, ob
> > ein beliebiger Wert ein Vorfahre von a ist.
> >=20
> >=20
> > Wert - Kind
> >   3  |  7
> >   3  |  8
> >   4  |  9
> > ...
> >   7  |  12
> >  12  |  13
> >=20
> >=20
> > Wenn ich nun den Wert "13" habe, m=F6chte ich als Ergebnis der =
> Abfrage
> > folgendes bekommen:
> >=20
> > 13
> > 12
> > 7
> > 3
> >=20
> > Stefan.....
> >=20
> > | [aspdedatabase] als [EMAIL PROTECTED] subscribed
> > | http://www.aspgerman.com/archiv/aspdedatabase/ =3D Listenarchiv
Sie
> > | k=F6nnen sich unter folgender URL an- und abmelden: =
> http://www.aspgerman.com/aspgerman/listen/anmelden/aspdedatabase.asp
> >=20
> 
> | [aspdedatabase] als [EMAIL PROTECTED] subscribed
> | http://www.aspgerman.com/archiv/aspdedatabase/ =3D Listenarchiv Sie
> | k�nnen sich unter folgender URL an- und abmelden:
> | http://www.aspgerman.com/aspgerman/listen/anmelden/aspdedatabase.asp
> 
> 
> 
> | [aspdedatabase] als [EMAIL PROTECTED] subscribed
> | http://www.aspgerman.com/archiv/aspdedatabase/ = Listenarchiv
> | Sie k�nnen sich unter folgender URL an- und abmelden:
> | http://www.aspgerman.com/aspgerman/listen/anmelden/aspdedatabase.asp


| [aspdedatabase] als [email protected] subscribed
| http://www.aspgerman.com/archiv/aspdedatabase/ = Listenarchiv
| Sie k�nnen sich unter folgender URL an- und abmelden:
| http://www.aspgerman.com/aspgerman/listen/anmelden/aspdedatabase.asp

Antwort per Email an