Avatar billede pingo Nybegynder
14. november 2000 - 08:53 Der er 10 kommentarer og
1 løsning

Rekursiv stored procedure der resulterer i ét recordsæt.

Hejsa.

Jeg kunne godt tænke mig at finde ud af om man kan lave en rekursiv stored procedure, der munder ud i ét recordsæt?

Problemet er at jeg har en tabel - med felterne ID, TilknytX, TilknytY - ID er de enkelte felters ID nummer, og tilknytx og tilknyty er numre for hvad feltet er tilknyttet i henholdsvis x og y retningen - de relaterer altså begge til id nummeret i den samme tabel. Det jeg så vil er at køre alle felterne igennem rekursivt, indtil de ikke længere er tilknyttet andre felter - og det skal gerne resultere i ét recordsæt.

Kan man det - eller kan man evt. gøre det på en anden måde?

For at supplere kan jeg nævne at antallet af subs (felter tilknyttet hinanden) er ukendt - men vil altid holde sig under de 135 (eller lign.) subs man kan kalde en recursiv stored procedure med.

Jeg sætter 1000 point - en meget god løsning jeg nemt kan få til at fungere kan få 1000 mer\'.
Avatar billede tigerdyr Nybegynder
14. november 2000 - 09:08 #1
vil du have det ud med en cursor eller blot som et almindeligt resultat ?
Avatar billede henrikdahl Nybegynder
16. november 2000 - 23:08 #2
Hej tigerdyr!

Nu er det vel en tiger, og ikke blot en missekat.

OK, her får du en løsning.

Fundament:

Flg. returnerer kun et recordset:

select 1
union
select 2

Du kan også skrive:

execute (\'select 1 union select 2\')

Løsning:

Du opbygger din streng, der repræsenterer det samlede recordset, rekursivt og afvikler det resulterende query ved et kald til execute.

Alternativ løsning:

Lav en temporær tabel, fyld den ud rekursivt og select alt fra den når topniveau funktionen returnerer.

Med venlig hilsen,

Henrik Dahl
Avatar billede henrikdahl Nybegynder
16. november 2000 - 23:09 #3
Jeg skulle have klikket \"Svar\", undskyld.
Avatar billede henrikdahl Nybegynder
16. november 2000 - 23:10 #4
Det skulle også have været Hej Pingo, igen undskyld.
Avatar billede pingo Nybegynder
17. november 2000 - 08:57 #5
tigerdyr: det er ligemeget - en cursor vil være ok - og et recordsæt vil være ok.
Avatar billede pingo Nybegynder
17. november 2000 - 08:58 #6
henrikdahl: hmm - den første løsning - jeg har selv overvejet at bruge union - men problemet er at det jo ikke kun er 2 select sætninger - hvis det skulle kunne fungere, så skal man vel kunne lave en union på en stored procedure? - og det kan man så vidt jeg ved ikke.

den alternative løsning har jeg også overvejet - men jeg vil helst undgå den.
Avatar billede leander Nybegynder
24. november 2000 - 12:41 #7
Jeg vil ikke sætte den på som et svar, da jeg er ret usikker på følgende :-)

Jeg mener at have hørt at det i MSSQL7 er muligt at returnere et table - prøv at undersøge det, det kan være du kan lave noget med det (et temporary table f.eks.)
Avatar billede henrikdahl Nybegynder
24. november 2000 - 13:40 #8
Nej, men i SQL Server 2000 er der en tabel datatype.
Avatar billede jennemaan Nybegynder
16. januar 2001 - 13:17 #9
hmm.... hvordan ligger felterne?

Hvis vi nu forestiller os:

A B C

D E F

G H I

vil tabellen så se ud som:

ID  TilnytX  TilknytY
A    B        D
B    C        E
C    <null>    F
D    E        G
E    F        H
F    <null>    I
G    H        <null>
H    I        <null>
I    <null>    <null>

?

Hvis tabellen ser således ud, hvordan vil du så have at dit resulterende recordset ser ud??? Vil du arbejde rækkevist eller søjlevist (ABC - ADG)?
Avatar billede pingo Nybegynder
23. april 2001 - 09:05 #10
Henrik: Det er ikke en stored procedure
Avatar billede pingo Nybegynder
02. august 2001 - 11:33 #11
Lukket!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester