Was diese Abfrage macht, um erstellen Sie durch Komma getrennte Liste mit SQL-Server?
Ich geschrieben habe, diese Abfrage mit Hilfe von google erstellen Sie eine durch Trennzeichen getrennte Liste aus einer Tabelle, aber ich Verstand nicht alles, was aus dieser Abfrage.
Kann jemand mir erklären, was passiert
SELECT
E1.deptno,
allemp = Replace ((SELECT E2.ename AS 'data()'
FROM emp AS e2
WHERE e1.deptno = e2.DEPTNO
FOR xml PATH('')), ' ', ', ')
FROM EMP AS e1
GROUP BY DEPTNO;
Gibt mir das Ergebnis
10 CLARK, KING, MILLER
20 SMITH, JONES, SCOTT, ADAMS, FORD
30 ALLEN, WARD, MARTIN, BLAKE, TURNER, JAMES
BITTE BEACHTEN Sie, DASS IHR CODE FEHLSCHLÄGT, TEXTE MIT ZEICHEN WIE > < & Sie erhalten character expansion wie
<
, >
&
es gibt einen besseren Weg, dies zu tun Verkettung finden Sie unter: stackoverflow.com/a/5031297/65223InformationsquelleAutor Registered User | 2012-04-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einfachste Möglichkeit zu erklären, es ist zu sehen, wie
FOR XML PATH
arbeitet für die eigentlichen XML. Stellen Sie sich eine einfache TabelleEmployee
:Könnten Sie
Dies würde das erstellen von XML wie folgt
Entfernen der 'Mitarbeiter' aus
PATH
entfernt die äußere xml-tags, so dass diese Abfrage:Schaffen würde
Was Sie dann tun, ist nicht ideal, wird die Spalte mit dem Namen 'data()' erzwingt einen sql-Fehler, weil es versucht, zu erstellen, die ein xml-tag, das ist nicht legal-tag, so wird der folgende Fehler generiert:
Die korrelierte Unterabfrage blendet diesen Fehler und erzeugt die XML keine tags:
erstellt
Sind Sie dann ersetzen Leerzeichen mit Kommata, ziemlich selbsterklärend...
Wenn ich du wäre würde ich die Anpassung der Abfrage etwas:
Dass keine Spalte mit alias, dass keine xml-tags erstellt werden, und das hinzufügen das Komma innerhalb der select-Abfrage alle Namen mit Leerzeichen nicht dazu führen, Fehler,
STUFF
wird Sie den ersten Komma und ein Leerzeichen.NACHTRAG
Zu erarbeiten, was KM gesagt hat, in einem Kommentar, wie dies scheint zu sein, immer ein paar mehr Ansichten, den richtigen Weg zu entkommen XML-Zeichen zu verwenden
.value
wie folgt:+1 gute Erklärung, aber BITTE BEACHTEN: DIESER CODE WIRD nicht FÜR die TEXT ENTHÄLT ZEICHEN WIE > < & Sie erhalten character expansion wie
<
,>
&
es gibt einen besseren Weg, dies zu tun Verkettung finden Sie unter: stackoverflow.com/a/5031297/65223Sie sind nicht ein einziges Zitat als Abschluss
'NVARCHAR(MAX)'
Tolle Antwort...
InformationsquelleAutor GarethD
Nehmen es auseinander, Schritt für Schritt von innen heraus.
Schritt 1:
Laufen die innerste Abfrage und sehen, was es produziert:
Sollte man eine Ausgabe etwas wie:
Schritt 2:
Den
REPLACE
nur ersetzt Leerzeichen mit,
- so drehen Sie Ihre Ausgabe inSchritt 3:
Der äußeren Abfrage wird die
deptno
Wert - plus die Ergebnisse aus der inneren Abfrage - und produziert Ihre endgültige Ergebnis.InformationsquelleAutor marc_s
SQL Server 2017 macht dies viel einfacher mit der neue
STRING_AGG
. Kam vor kurzem in diesem post und schaltete mein ZEUG/FÜR XML - Strategie zu nutzen, die neue string-Funktion. Vermeidet auch die Notwendigkeit zu tun, ein extra-JOIN/SUBQUERYand der Aufwand FÜR XML (und die ungeraden-encoding-Fehler) und schwer zu interpretieren, SQL.Hinweis: Auch sicher sein,überprüfen Sie heraus das Gegenstück zu
STRING_SPLIT
, dass das arbeiten mit SQL-getrennte Daten viel einfacher.InformationsquelleAutor SliverNinja - MSFT
Den äußeren Abfrage ruft eine Liste der Abteilung zahlen, und die Unterabfrage wird dann für jede einzelne Abteilung Anzahl, um alle Namen gehören zu dieser Abteilung. Die Unterabfrage verwendet die FOR XML-Anweisung zum formatieren der Ausgabe in eine Zeile, durch Kommata getrennte Liste.
InformationsquelleAutor Miika L.