您應該只需確保在查詢中輸入','逗號。所以','+ c.Name。
SELECT
s.Id
,s.Name
,STUFF(
(
SELECT
',' + c.Name
FROM [Groups] AS c
INNER JOIN [GroupToUser] AS stc ON stc.CategoryId = c.Id
WHERE stc.StageId = s.Id
FOR XML PATH('')
), 1, 1, '') AS GroupsTheUserBelongsTo
FROM [Users] AS s
因此要解釋發生了什麼事情。你有一個標準的查詢,然後你告訴sql-server轉換成XML,但沒有根元素,因爲沒有列名,它也將沒有標籤。當您添加逗號或其他分隔符時,它將在每行之間放置逗號。 STUFF(xmlstring,1,1,'')表示在字符串的第一個位置取出那裏的字符並放入「1」中,這與刪除前導逗號基本相同。
這裏有一個小例子可以將它分解成多個部分,以便更好地理解發生了什麼。
DECLARE @Table AS TABLE (Col VARCHAR(10))
INSERT INTO @Table VALUES ('A'),('B'),('C')
DECLARE @Values AS VARCHAR(MAX)
SELECT @Values = (
SELECT
',' + Col
FROM
@Table
FOR XML PATH (''))
SELECT @Values
SELECT STUFF(@Values,1,1,'')
@DanGuzman使得一個好點,如果你擔心你的名字列特殊字符編碼變得/替換而留在您的字符串XML編碼你可以試試:
SELECT
s.Id
,s.Name
,STUFF((
SELECT
',' + c.Name
FROM [Groups] AS c
INNER JOIN [GroupToUser] AS stc ON stc.CategoryId = c.Id
WHERE stc.StageId = s.Id
FOR XML PATH (''), TYPE).value('.','nvarchar(MAX)')
,1,1,'') AS GroupsTheUserBelongsTo
FROM
[Users] AS s
@Jaylen是它添加了一個分隔符,以便您的字符串實際上是逗號分隔的字符串。就XML而言,數據類型應該是字符數據類型NOT XML,但如果您沒有獲得預期的數據類型,您也可以專門將其轉換回VARCHAR(MAX)或任何您想要的。 https://msdn.microsoft.com/en-us/library/ms188043.aspx – Matt
注意結果將包含XML實體引用而不是原始字符(例如,「&」而不是「&」)來轉義某些字符,除非' TYPE'與'value'方法一起指定:'FOR XML PATH(''),TYPE).value('。','nvarchar(MAX)')'。 –