Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come funzionano Stuff e "Per percorso XML" in SQL Server?

Ecco come funziona:

1. Ottieni una stringa di elementi XML con FOR XML

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

2. Rimuovi la virgola iniziale con STUFF

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

3. Iscriviti su ID per ottenere l'elenco completo

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:

ID Nome 1aaa,bbb,ccc,ddd,eee

Spero che questo aiuti!