如何将多行文本连接到 SQL 服务器中的单个文本字符串中?

一个包含名称的数据库表,它有三行:
Peter
Paul
Mary
有没有一个简单的方法把它变成一行Peter, Paul, Mary?

MS SQL Server中的XML data() 命令尚未显示的一种方法是:
假设名为 NameList 的表有一个名为 FName 的列,
SELECT FName + ', ' AS 'data()' FROM NameList FOR XML PATH('')
returns:
"Peter, Paul, Mary, "
只有多余的逗号必须处理。
可以使用以下方法删除后面的逗号。 使用相同的表名和列名:
STUFF(REPLACE((SELECT '#!' + LTRIM(RTRIM(FName)) AS 'data()' FROM NameListFOR XML PATH('')),' #!',', '), 1, 2, '') as Brands

用COALESCE:
DECLARE @Names VARCHAR(8000) SELECT @Names = COALESCE(@Names + ', ', '') + Name FROM People
只是一些解释(因为这个答案似乎找到了相对常见的观点) :
• COALESCE实际上只是“骗局”,可以达到两个目的:
1)不需要用空字符串值初始化@names。
2)不需要在最后再去掉一个额外的分离器。
• 如果一行的名称值为空,上面的解决方案将给出不正确的结果(如果有null,则null将使@names在该行之后为null,下一行将再次以空字符串开始。两种解决方案中的一种很容易解决:

DECLARE @Names VARCHAR(8000) SELECT @Names = COALESCE(@Names + ', ', '') + NameFROM PeopleWHERE Name IS NOT NULL

或者

DECLARE @Names VARCHAR(8000) SELECT @Names = COALESCE(@Names + ', ', '') + 
    ISNULL(Name, 'N/A')FROM People

根据想要的指令(第一个选项只是过滤掉空值,第二个选项用标记消息[用适合内容替换 'N/A' )将它们保留在列表中)。

当我试图用一对多关系连接两个表时,也遇到了类似的问题。 在 SQL 2005中,我发现 XML PATH 方法可以非常容易地处理行的串联。
如果有一个叫做 STUDENTS的table
SubjectID StudentName---------- -------------1 Mary1 John1 Sam2 Alaina2 Edward
我期待的是结果:
SubjectID StudentName---------- -------------1 Mary, John, Sam2 Alaina, Edward
我使用了 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]

如果你可以在开头使用逗号,然后使用子字符串跳过第一个,这样你就不需要执行子查询了,那么你可以用一种更简洁的方式来做同样的事情:

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