Generieren von durch Kommas getrennten Listen in SQL Server
In dieser Anleitung wird erläutert, wie Sie durch Kommas getrennte Listen aus SQL Server-Tabellen erstellen. Die Methoden nutzen FOR XML PATH
und STUFF
für eine effiziente Listengenerierung.
Den Ansatz verstehen
Die Kerntechnik kombiniert FOR XML PATH('')
zum Extrahieren von Daten als Zeichenfolge (ohne XML-Tags) und STUFF
zum Ersetzen von Leerzeichen durch Kommas. Dieser Ansatz weist jedoch Einschränkungen auf.
Aufschlüsselung der ursprünglichen Abfrage:
Die ursprüngliche Methode verwendet FOR XML PATH('')
, um Daten als Zeichenfolge abzurufen. Der data()
-Alias ist zwar scheinbar ein XML-Element, stellt jedoch eine Problemumgehung dar, die während der XML-Generierung einen Fehler erzeugt, der anschließend von der äußeren Abfrage behandelt wird. Diese Fehlerbehandlung ist alles andere als ideal.
Verbesserte Abfrage:
Eine robustere Lösung wird unten vorgestellt:
<code class="language-sql">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;</code>
Diese verbesserte Abfrage verkettet Werte direkt mit Kommas und eliminiert so die fehleranfällige XML-Problemumgehung.
Erweiterte XML-Verarbeitung:
Um mögliche Probleme mit speziellen XML-Zeichen zu vermeiden, verwenden Sie .value
für eine sicherere XML-Verarbeitung:
<code class="language-sql">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;</code>
Diese letzte Abfrage bietet die zuverlässigste Methode zum Generieren durch Kommas getrennter Listen in SQL Server und mindert potenzielle XML-bezogene Fehler. Das .value('.', 'NVARCHAR(MAX)')
konvertiert die XML-Ausgabe explizit in eine Zeichenfolge, um die Kompatibilität sicherzustellen und unerwartetes Verhalten zu verhindern.
Das obige ist der detaillierte Inhalt vonWie erstelle ich effizient durch Kommas getrennte Listen in SQL Server?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!