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
