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)進行快速測試。查看我的個人資料以獲取更有趣的內容 –