2017-12-08 16 views
0

SQL ServerのFOR XML PATH('')を使用して特定の列で列の値をグループ化しようとしています。SQL Serverを使用してXML PATHを1つずつ出力する

例えば、ModuleIDの値1を渡すと、存在する出力RoleName : Admin Administrator Super Adminは同じ行になります。

ALTER PROCEDURE [dbo].[MEDEIL_SiteRoleModules_SelectOne] 
    @ModuleID int 
AS 
    SELECT 
     t1.ModuleID, 
     RoleName = (SELECT s1.RoleName AS [data()] 
        FROM SiteRoleModules t2 
        INNER JOIN SiteRoles s1 ON t2.RoleID = s1.RoleID 
        WHERE t2.ModuleID = t1.ModuleID 
        GROUP BY s1.RoleName 
        FOR XML PATH('')) 
    FROM 
     SiteRoleModules t1 
    WHERE 
     ModuleId = @ModuleID 
    GROUP BY 
     ModuleID 

output

は私が .node方法..あなたが xquery試みることができる1

Sql Output

+0

コードでは1つのグループのみが返されるため、ModuleId = 1とGroupを使用することは意味がありません。場所を削除します。 – jdweng

+0

今すぐ確認してください更新コード@jdweng –

+0

動作していますか?データベースに管理者、管理者、およびスーパー管理者のデータがありますか? – jdweng

答えて

0

ずつ表示する必要が

select 
      case when row_number() over (partition by a.ModuleID order by a.ModuleID) > 1 then '' else cast(a.ModuleID as varchar) end [ModuleID], 
      id.value('.', 'varchar(50)') [RoleName] from 
    (
     select ModuleID , cast('<m>'+replace(RoleName, space(1), '</m><m>')+'</m>' as xml) RoleName from <table> 
    ) a cross apply RoleName.nodes ('/m') as RoleName(id) 

結果:

ModuleID RoleName 
1   Admin 
      Administrator 
      Super 
      Admin 
+0

https://ibb.co/kg8qKb何らかのエラー –

+0

無効な列名ModuleIDとRoleName –

+0

@IvinRaj適切な列名を使用してテーブル名を変更しようとします。 –

1

CHAR(10)を使用すると、改行することができます。

SELECT 
    t1.ModuleID, 
    RoleName = (SELECT CHAR(10) + s1.RoleName 
       FROM SiteRoleModules t2 
       INNER JOIN SiteRoles s1 ON t2.RoleID = s1.RoleID 
       WHERE t2.ModuleID = t1.ModuleID 
       GROUP BY s1.RoleName 
       FOR XML PATH('')) 
FROM 
    SiteRoleModules t1 
WHERE 
    ModuleId = @ModuleID 
GROUP BY 
    ModuleID 
+0

作業中です –

+0

管理スタジオは同じ行を表示していますが、セルをコピーして貼り付けると、行が壊れています。 – lucky

+0

大丈夫ですか?セルのコピー貼り付けはどうですか? –

関連する問題