2016-09-19 10 views
0

STUFF関数を使用して、複数行のデータをカンマ区切り文字列に結合しようとしています。ここで複数のrowssをSQL Serverのコンマ区切り文字列に正しく結合する方法

は私が期待されるようにこれが何らかの形で働いている

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)') '。 –

関連する問題