Avatar billede kronsj Nybegynder
24. maj 2005 - 00:29 Der er 8 kommentarer og
1 løsning

Sammlægning af flere rows i et felt

Spørgsmål om konvertering :

Jeg har en foto -tabel :
[
billedid,
Titel,
Note
]

Jeg har en fotopers tabel
[
PID
navn
Billedid
]

En kort join vil vise alle personer der er på et billede.
Men nu skal navne på alle personer med et bestemt billedID puttes ind i note-feltet på et billede.
Altså :
KAN MAN FLETTE FLERE RÆKKERS VÆRDI IND I ET FELT VIA T-SQL (MS-SQL)?
Der er RIGTIGT mange records, så det ville være en lettelse, hvis det kunne se via SQL
Avatar billede arne_v Ekspert
24. maj 2005 - 09:01 #1
Det var en meget u-relationel ting at gøre.

Jeg tror iøvrigt at det vil være meget besværligt at lave i TSQL (en meget
klodset stored procedure).

Jeg ville lave logikken i applikationen:

SELECT PID,navn,Billedid FROM fotopers ORDER BY Billedid
løbe der result set igennem og akkumulere alle navne for et Billedid og lave en UPDATE foto med udfra den
Avatar billede teepee Nybegynder
24. maj 2005 - 10:29 #2
Lav en stored function PersonerIFoto(billedid) som åbner en cursor og samler rækkerne i en tekstreng, returner tekststrengen. Så kan du selecte

select billedid, titel, PersonerIFoto(billedid), note
from fototabel
Avatar billede kronsj Nybegynder
24. maj 2005 - 12:50 #3
Jeg overvejer også kraftigt at lave en hurtig .net-applikation der udfører dette. Men da konverteringen også indeholder adskilligt flere tabeller, helder jeg meget til at koncentrere mig om sql-løsningen. Og det bliver nok ikke sidste gang at der skal konverteres lignende tabeller. Og jeg mener også at Sql-serveren er betydeligt mere intelligent til at konvertere datatyper end via ADO.NET.
Avatar billede ldanielsen Nybegynder
24. maj 2005 - 15:54 #4
Du kan lave en function:

CREATE FUNCTION dbo.f_Personer_Kommasep (@BilledID int) 
RETURNS varchar(500) AS 
BEGIN

DECLARE @strTemp varchar(200), @stReturn varchar(2000), @stSep varchar(2)

DECLARE curPersoner CURSOR FOR
SELECT fotopers.Navn FROM fotopers INNER JOIN foto
  ON fotopers.BilledID = foto.BilledID WHERE BilledID = @BilledID

OPEN curPersoner

SET @stSep = ''
SET @stReturn = ''

FETCH NEXT FROM curPersoner INTO @strTemp
WHILE (@@FETCH_STATUS = 0)
BEGIN
    SET @stReturn = @stReturn + @stSep + @strTemp
    SET @stSep = ', '
    FETCH NEXT FROM curPersoner INTO @strTemp
END

CLOSE curPersoner
DEALLOCATE curPersoner

RETURN @stReturn

END


Og så kalde den:

SELECT Titel, dbo.f_Personer_Kommasep(BilledID) AS Personliste FROM foto WHERE ...

Men jeg vil råde dig til kun at kalde den for nogle få rækker, for den er tung at køre.
Avatar billede kronsj Nybegynder
24. maj 2005 - 23:16 #5
Ikke et øje var tørt, da jeg kørte Idanielsen's forslag på min SQL-server. Ca 8000 billeder, kræver lidt tid, men funktionen virkede perfekt. Alle der har deltaget skal have mange tak - men jeg vil gerne have at Idanielsen lige lægger et svar ind, så jeg kan give ham (øøhh../hende) de meget fortjente point.
Tak for hjælp og kommentarer.
Avatar billede ldanielsen Nybegynder
26. maj 2005 - 01:31 #6
Jamen selv tak da!

Faktisk var teepee først med ideen, så vi skulle måske dele?
Avatar billede teepee Nybegynder
26. maj 2005 - 08:34 #7
ldanielsen => du har jo lavet al fodarbejdet, så du fortjener vist æren...
Avatar billede kronsj Nybegynder
26. maj 2005 - 13:32 #8
Pokkers - jeg skulle ellers lige sidde og spille klog, og bede (endnu engang) om at Idanielsen sendte et svar i stedet for en kommentar. Det endte desværre med at teepee fik hele puljen. Jeg ville nu foretrække at fordelingen blev mindst 200 point til Idanielsen (hvilket vidst også er max hos Eksperten.dk) Så finder lige ud af hvordan vi klarer dette problem.
Endnu engang godt gået - ikke mindst IDanielsen.
Avatar billede arne_v Ekspert
26. maj 2005 - 13:53 #9
da der ikke må gives mere end 200 for et spørgsmål så er den eneste mulige løsning
vist hvis teepee opretter et overførsels spørgsmål til ldanielsen med reference
til dette spørgsmål
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