Så här fungerar det:
1. Hämta XML-elementsträng med FOR XML
Genom att lägga till FOR XML PATH i slutet av en fråga kan du mata ut resultaten av frågan som XML-element, med elementnamnet i PATH-argumentet. Till exempel, om vi skulle köra följande sats:
SELECT ',' + name
FROM temp1
FOR XML PATH ('')
Genom att skicka in en tom sträng (FOR XML PATH('')) får vi istället följande:
,aaa,bbb,ccc,ddd,eee
2. Ta bort inledande kommatecken med STUFF
STUFF-satsen "stoppar" bokstavligen en sträng i en annan och ersätter tecken i den första strängen. Vi använder den dock helt enkelt för att ta bort det första tecknet i den resulterande värdelistan.
SELECT abc = STUFF((
SELECT ',' + NAME
FROM temp1
FOR XML PATH('')
), 1, 1, '')
FROM temp1
Parametrarna för STUFF
är:
- Strängen som ska "fyllas" (i vårt fall den fullständiga listan med namn med ett kommatecken)
- Platsen för att börja radera och infoga tecken (1, vi stoppar in i en tom sträng)
- Antalet tecken som ska raderas (1, är det inledande kommatecken)
Så vi slutar med:
aaa,bbb,ccc,ddd,eee
3. Gå med på id för att få hela listan
Därefter ansluter vi bara till detta på listan över id i temptabellen, för att få en lista över ID:n med namn:
SELECT ID, abc = STUFF(
(SELECT ',' + name
FROM temp1 t1
WHERE t1.id = t2.id
FOR XML PATH (''))
, 1, 1, '') from temp1 t2
group by id;
Och vi har vårt resultat:
Hoppas detta hjälper!