Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como concatenar texto de várias linhas em uma única string de texto no SQL Server


Se você estiver no SQL Server 2017 ou no Azure, confira a resposta de Mathieu Renda.

Eu tive um problema semelhante ao tentar unir duas tabelas com relacionamentos um para muitos. No SQL 2005, descobri que XML PATH O método pode lidar com a concatenação das linhas com muita facilidade.

Se houver uma tabela chamada STUDENTS
SubjectID       StudentName
----------      -------------
1               Mary
1               John
1               Sam
2               Alaina
2               Edward

Resultado que eu esperava era:
SubjectID       StudentName
----------      -------------
1               Mary, John, Sam
2               Alaina, Edward

Eu usei o seguinte 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]

Você pode fazer a mesma coisa de uma maneira mais compacta se puder concatenar as vírgulas no início e usar substring para pular a primeira para não precisar fazer uma subconsulta:
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