Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come concatenare il testo da più righe in un'unica stringa di testo in SQL Server

Se utilizzi SQL Server 2017 o Azure, vedi la risposta di Mathieu Renda.

Ho avuto un problema simile quando stavo cercando di unire due tabelle con relazioni uno-a-molti. In SQL 2005 ho trovato che XML PATH il metodo può gestire la concatenazione delle righe molto facilmente.

Se esiste una tabella chiamata STUDENTS

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

Il risultato che mi aspettavo era:

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

Ho usato il seguente T-SQL :

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]

Puoi fare la stessa cosa in modo più compatto se puoi concatenare le virgole all'inizio e usare substring per saltare la prima in modo da non dover eseguire una sottoquery:

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