3
考虑下面的数据集一个XML列,我想Name
分组的数据,但RoleID
,RoleName
,PermissionID
和PermissionName
值被放在一起作为一个单XML值:如何选择多行与T-SQL和XQuery
Name RoleID RoleName PermissionID PermissionName
--------------- ----------- ------------- ------------ ---------------
User 1 2 Super User 1 View
User 1 2 Super User 2 Create
User 1 2 Super User 3 Edit
User 1 2 Super User 4 Delete
User 1 3 Report User 17 Execute
所以,输出我试图去,应该是这个样子:
Name Roles
------------ -------------------------------------------------------
User 1 <Roles>
<Role id="2" name="Super User">
<Permissions>
<Permission id="1" name="View" />
<Permission id="2" name="Create" />
<Permission id="3" name="Edit" />
<Permission id="4" name="Delete" />
</Permissions>
</Role>
<Role id="3" name="Report User">
<Permissions>
<Permission id="17" name="Execute" />
</Permissions>
</Role>
</Roles>
我曾尝试以下,但它会创建一个Role
行在数据集中的每个条目:
SELECT
U.[ID] as [Name]
, CONVERT(xml, (
SELECT
R.[ID] as '@id'
, R.[Name] as '@name'
, CONVERT(xml, (
SELECT
P.[ID] as '@id'
, P.[Name] as '@name'
FOR XML PATH('Permission')
)) as [Permissions]
FOR XML PATH('Role'), ROOT('Roles')
)) as [Roles]
FROM User U
LEFT JOIN UserRoles UR ON
U.[ID] = UR.[UserID]
LEFT JOIN Role R ON
UR.[RoleID] = R.[ID]
LEFT JOIN RolePermissions RP ON
R.[ID] = RP.[RoleID]
LEFT JOIN Permission P ON
RP.[PermissionID] = P.[ID]
WHERE
U.[ID] = 1234
AFAICT演员阵容到XML是没有必要的,如果你指定'FOR XML PATH('角色'),ROOT('角色'),TYPE''。参考:[FOR XML查询中的TYPE指令](https://msdn.microsoft.com/zh-cn/library/ms190025.aspx):*请求通过指定FOR XML查询的结果作为xml数据类型返回TYPE指令*。 –
PS:您可以在[RexTester](http://rextester.com/l/sql_server_online_compiler)进行快速测试。查看我的个人资料以获取更有趣的内容 –