2016-09-19 45 views
0

我試圖使用STUFF函數將多行數據組合成逗號分隔的字符串。如何在SQL Server中將多個rowss正確地組合成逗號分隔的字符串

這裏是我做了什麼

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 

這是工作在某種程度上像預期。但是,它返回XML字符串缺少第一個字符。

如何才能讓它返回逗號分隔的字符串而不是XML?

回答

0

您應該只需確保在查詢中輸入','逗號。所以','+ 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 
+0

@Jaylen是它添加了一個分隔符,以便您的字符串實際上是逗號分隔的字符串。就XML而言,數據類型應該是字符數據類型NOT XML,但如果您沒有獲得預期的數據類型,您也可以專門將其轉換回VARCHAR(MAX)或任何您想要的。 https://msdn.microsoft.com/en-us/library/ms188043.aspx – Matt

+1

注意結果將包含XML實體引用而不是原始字符(例如,「&」而不是「&」)來轉義某些字符,除非' TYPE'與'value'方法一起指定:'FOR XML PATH(''),TYPE).value('。','nvarchar(MAX)')'。 –

相關問題