Sådan fungerer det:
1. Hent XML-elementstreng med FOR XML
Tilføjelse af FOR XML PATH til slutningen af en forespørgsel giver dig mulighed for at udlæse resultaterne af forespørgslen som XML-elementer med elementnavnet indeholdt i PATH-argumentet. For eksempel, hvis vi skulle køre følgende sætning:
SELECT ',' + name
FROM temp1
FOR XML PATH ('')
Ved at indsætte en tom streng (FOR XML PATH('')), får vi i stedet følgende:
,aaa,bbb,ccc,ddd,eee
2. Fjern indledende komma med STUFF
STUFF-sætningen "stopper" bogstaveligt talt en streng ind i en anden, og erstatter tegn i den første streng. Vi bruger den imidlertid blot til at fjerne det første tegn i den resulterende liste over værdier.
SELECT abc = STUFF((
SELECT ',' + NAME
FROM temp1
FOR XML PATH('')
), 1, 1, '')
FROM temp1
Parametrene for STUFF
er:
- Den streng, der skal "fyldes" (i vores tilfælde den fulde liste over navne med aleading komma)
- Placeringen for at begynde at slette og indsætte tegn (1, vi propper i en tom streng)
- Antallet af tegn, der skal slettes (1, er det indledende komma)
Så vi ender med:
aaa,bbb,ccc,ddd,eee
3. Tilmeld dig på id for at få den fulde liste
Dernæst slutter vi os bare til dette på listen over id i temp-tabellen for at få en liste over ID'er med navn:
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;
Og vi har vores resultat:
Håber dette hjælper!