Die einfachste Möglichkeit, es zu erklären, ist zu sehen, wie FOR XML PATH
für tatsächliche XML funktioniert.Dies würde XML erstellen wie folgt
<Employee>
<EmployeeID>1</EmployeeID>
<Name>John Smith</Name>
</Employee>
<Employee>
<EmployeeID>2</EmployeeID>
<Name>Jane Doe</Name>
</Employee>
die 'Mitarbeiter' aus PATH
Beim Entfernen der äußeren XML-Tags diese
EmployeeID Name
1 John Smith
2 Jane Doe
Sie
SELECT EmployeeID, Name
FROM emp.Employee
FOR XML PATH ('Employee')
verwenden: eine einfache Tabelle vorstellen Employee
Abfrage:
SELECT Name
FROM Employee
FOR XML PATH ('')
Würde
<Name>John Smith</Name>
<Name>Jane Doe</Name>
erstellen Was Sie tun, dann ist nicht ideal, die Spaltennamen ‚Daten()‘ erzwingt einen SQL-Fehler, weil es versucht, ein XML-Tag zu erstellen, das keine juristische Tag ist, so Der folgende Fehler wird generiert:
Spaltenname 'Data()' enthält eine ungültige XML-Kennung wie von FOR XML erforderlich; '(' (0x0028) ist das erste Zeichen Schuld
Die korrelierte Unterabfrage diesen Fehler versteckt und erzeugt nur die XML ohne tags:.
SELECT Name AS [Data()]
FROM Employee
FOR XML PATH ('')
schafft
John Smith Jane Doe
Sie dann werden Leerzeichen durch Kommas ersetzt, ziemlich selbsterklärend ...
Wenn ich du wäre würde ich die Abfrage etwas anpassen:
SELECT E1.deptno,
STUFF((SELECT ', ' + E2.ename
FROM emp AS e2
WHERE e1.deptno = e2.DEPTNO
FOR XML PATH('')
), 1, 2, '')
FROM EMP AS e1
GROUP BY DEPTNO;
kein Spalt-Alias wird in der SELECT-Abfrage keine XML-Tags erstellt werden, und das Hinzufügen des Kommas bedeuten bedeutet keine Namen mit Leerzeichen in nicht zu Fehlern führen, STUFF
das erste Komma und Leerzeichen entfernen.
NACHTRAG
Um sich zu erarbeiten, was KM in einem Kommentar gesagt hat, als dies der richtige Weg XML-Zeichen immer noch ein paar Ansichten zu sein scheint, zu entkommen wäre .value
wie folgt zu verwenden:
SELECT E1.deptno,
STUFF((SELECT ', ' + E2.ename
FROM emp AS e2
WHERE e1.deptno = e2.DEPTNO
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
FROM EMP AS e1
GROUP BY DEPTNO;
** Bitte beachten Sie, dass der Code für Text mit Zeichen wie><& scheitern ** Sie Charakter Expansion erhalten '<', '>' '' & es einen besseren Weg, diese Verkettung finden Sie unter: http://Stackoverflow.com/a/5031297/65223 –