Ecco come funziona:
L'aggiunta di FOR XML PATH alla fine di una query consente di restituire i risultati della query come elementi XML, con il nome dell'elemento contenuto nell'argomento PATH. Ad esempio, se dovessimo eseguire la seguente istruzione:
SELECT ',' + name
FROM temp1
FOR XML PATH ('')
Passando una stringa vuota (FOR XML PATH('')), otteniamo invece quanto segue:
,aaa,bbb,ccc,ddd,eee
L'istruzione STUFF letteralmente "compone" una stringa in un'altra, sostituendo i caratteri all'interno della prima stringa. Tuttavia, la stiamo usando semplicemente per rimuovere il primo carattere dell'elenco di valori risultante.
SELECT abc = STUFF((
SELECT ',' + NAME
FROM temp1
FOR XML PATH('')
), 1, 1, '')
FROM temp1
I parametri di STUFF
sono:
- La stringa da “riempire” (nel nostro caso l'elenco completo dei nomi con virgola iniziale)
- La posizione in cui iniziare a eliminare e inserire i caratteri (1, stiamo inserendo una stringa vuota)
- Il numero di caratteri da eliminare (1, essendo la virgola iniziale)
Quindi finiamo con:
aaa,bbb,ccc,ddd,eee
Quindi ci uniamo semplicemente a questo nell'elenco di ID nella tabella temporanea, per ottenere un elenco di ID con nome:
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;
E abbiamo il nostro risultato:
Spero che questo aiuti!