Tsql 如何使用T-SQL和XQuery选择多行作为单个XML列
给定以下数据集,我希望数据按Tsql 如何使用T-SQL和XQuery选择多行作为单个XML列,tsql,xquery,Tsql,Xquery,给定以下数据集,我希望数据按Name分组,但RoleID、RoleName、PermissionID和PermissionName的值作为单个XML值放在一起: Name RoleID RoleName PermissionID PermissionName --------------- ----------- ------------- ------------ --------------- User 1 2
Name
分组,但RoleID
、RoleName
、PermissionID
和PermissionName
的值作为单个XML值放在一起:
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>
我将您的数据集用作CTE(foo),并通过使用嵌套选择和分组方式获得所需的结果。我使用“Name”作为用户密钥,因为示例数据中没有用户ID,但您应该能够让它用于查询
with foo as
(
select
*
from
(values
('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')
) foo(Name,RoleID,RoleName,PermissionID,PermissionName)
)
select
Name,
cast((
SELECT
B.RoleID as '@id'
,B.RoleName as '@name'
,cast((select PermissionID as '@id',PermissionName as '@name'
from Foo C
where c.RoleID=b.RoleID
and c.Name=a.Name
for xml path('Permission')
) as xml) Permissions
FROM foo B
group by
B.RoleID
,B.RoleName
for xml path('Role'),root('Roles')
) as xml) Roles
from
foo a
group by Name
我尚未测试以下查询,但它应该非常接近于在您的表上运行的某个查询:
select
U.ID as [Name],
cast((
SELECT
R.[ID] as '@id'
, R.[Name] as '@name'
,cast(
(select
P.[ID] as '@id'
, P.[Name] as '@name'
from RolePermissions RP
LEFT JOIN Permission P ON
RP.[PermissionID] = P.[ID]
where R.[ID] = RP.[RoleID]
for xml path('Permission')
) as xml) [Permissions]
FROM UserRoles UR
Left Join Role R
ON UR.[RoleID] = R.[ID]
where U.[ID] = UR.[UserID]
group by
R.[ID]
,R.[Name]
for xml path('Role'),root('Roles')
) as xml) [Roles]
from
User U
group by ID
WHERE
U.[ID] = 1234
如果为XML路径('Role')、根('Roles')指定
,则不需要强制转换为XML,并键入“
。Reference::通过指定type指令,请求将FOR-XML查询的结果作为XML数据类型返回。PS:您可以在上进行快速测试。更多有趣的内容,请参见我的个人资料。
select
U.ID as [Name],
cast((
SELECT
R.[ID] as '@id'
, R.[Name] as '@name'
,cast(
(select
P.[ID] as '@id'
, P.[Name] as '@name'
from RolePermissions RP
LEFT JOIN Permission P ON
RP.[PermissionID] = P.[ID]
where R.[ID] = RP.[RoleID]
for xml path('Permission')
) as xml) [Permissions]
FROM UserRoles UR
Left Join Role R
ON UR.[RoleID] = R.[ID]
where U.[ID] = UR.[UserID]
group by
R.[ID]
,R.[Name]
for xml path('Role'),root('Roles')
) as xml) [Roles]
from
User U
group by ID
WHERE
U.[ID] = 1234