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

So verketten Sie Text aus mehreren Zeilen zu einer einzelnen Textzeichenfolge in SQL Server

Wenn Sie SQL Server 2017 oder Azure verwenden, lesen Sie die Antwort von Mathieu Renda.

Ich hatte ein ähnliches Problem, als ich versuchte, zwei Tische mit 1:n-Beziehungen zu verbinden. In SQL 2005 fand ich diesen XML PATH -Methode kann die Verkettung der Zeilen sehr einfach handhaben.

Wenn es eine Tabelle mit dem Namen STUDENTS gibt

SubjectID       StudentName
----------      -------------
1               Mary
1               John
1               Sam
2               Alaina
2               Edward

Das erwartete Ergebnis war:

SubjectID       StudentName
----------      -------------
1               Mary, John, Sam
2               Alaina, Edward

Ich habe das folgende T-SQL verwendet :

SELECT Main.SubjectID,
       LEFT(Main.Students,Len(Main.Students)-1) As "Students"
FROM
    (
        SELECT DISTINCT ST2.SubjectID, 
            (
                SELECT ST1.StudentName + ',' AS [text()]
                FROM dbo.Students ST1
                WHERE ST1.SubjectID = ST2.SubjectID
                ORDER BY ST1.SubjectID
                FOR XML PATH ('')
            ) [Students]
        FROM dbo.Students ST2
    ) [Main]

Sie können dasselbe auf kompaktere Weise tun, wenn Sie die Kommas am Anfang verketten und substring verwenden um die erste zu überspringen, damit Sie keine Unterabfrage machen müssen:

SELECT DISTINCT ST2.SubjectID, 
    SUBSTRING(
        (
            SELECT ','+ST1.StudentName  AS [text()]
            FROM dbo.Students ST1
            WHERE ST1.SubjectID = ST2.SubjectID
            ORDER BY ST1.SubjectID
            FOR XML PATH ('')
        ), 2, 1000) [Students]
FROM dbo.Students ST2