Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie funktionieren Stuff und 'For Xml Path' in SQL Server?

So funktioniert es:

1. XML-Element-String mit FOR XML abrufen

Durch Hinzufügen von FOR XML PATH am Ende einer Abfrage können Sie die Ergebnisse der Abfrage als XML-Elemente ausgeben, wobei der Elementname im PATH-Argument enthalten ist. Wenn wir zum Beispiel die folgende Anweisung ausführen würden:

SELECT ',' + name 
              FROM temp1
              FOR XML PATH ('')

Indem wir eine leere Zeichenfolge (FOR XML PATH('')) übergeben, erhalten wir stattdessen Folgendes:

,aaa,bbb,ccc,ddd,eee

2. Entfernen Sie das führende Komma mit STUFF

Die STUFF-Anweisung "stopft" buchstäblich einen String in einen anderen und ersetzt Zeichen innerhalb des ersten Strings. Wir verwenden sie jedoch einfach, um das erste Zeichen der resultierenden Werteliste zu entfernen.

SELECT abc = STUFF((
            SELECT ',' + NAME
            FROM temp1
            FOR XML PATH('')
            ), 1, 1, '')
FROM temp1

Die Parameter von STUFF sind:

  • Die Zeichenfolge, die „gestopft“ werden soll (in unserem Fall die vollständige Namensliste mit führendem Komma)
  • Die Stelle, an der mit dem Löschen und Einfügen von Zeichen begonnen werden soll (1, wir stopfen in eine leere Zeichenfolge)
  • Die Anzahl der zu löschenden Zeichen (1 als führendes Komma)

Also enden wir mit:

aaa,bbb,ccc,ddd,eee

3. Treten Sie der ID bei, um die vollständige Liste zu erhalten

Als nächstes fügen wir dies einfach in die Liste der IDs in der temporären Tabelle ein, um eine Liste der IDs mit dem Namen zu erhalten:

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;

Und wir haben unser Ergebnis:

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

Hoffe, das hilft!