关于从SQL语句/过程生成的多层XML的问题
我正在研究如何获取SQL语句(以及如何从存储过程中获取)并从查询结果生成XML输出。我所追求的XML输出如下所示:关于从SQL语句/过程生成的多层XML的问题,sql,sql-server,xml,Sql,Sql Server,Xml,我正在研究如何获取SQL语句(以及如何从存储过程中获取)并从查询结果生成XML输出。我所追求的XML输出如下所示: <Application> <Device AppEnabled="true" AsOf="06/03/2019 16:01:58 UTC" Name="MachineName"> <Groups> <Group Name="Administrators" ReportChanges="tru
<Application>
<Device AppEnabled="true" AsOf="06/03/2019 16:01:58 UTC" Name="MachineName">
<Groups>
<Group Name="Administrators" ReportChanges="true">
<Members>
<Member Name="AdminUser1" />
<Member Name="AdminUser2" />
<Member Name="AdminUser3" />
<Member Name="AdminUser4" />
</Members>
</Group>
<Group Name="Normal Users" ReportChanges="true">
<Members>
<Member Name="NormalUser1" />
<Member Name="NormalUser2" />
</Members>
</Group>
</Groups>
</Device>
</Application>
SELECT XMLSetting, XMLValue
FROM XMLItems;
理想情况下,我们会将“ComputerName”作为参数。“AsOf”将是当前的时间戳。“AppEnabled”将来自另一个查询,该查询检查此计算机是否设置为或多或少使用该应用程序。我想我可以查一下,然后把值存储在一个变量中
另一项是“reportchanges=true”实际上来自另一个查询,该查询查找要添加到“Group Name=xxx”项中的任何项。所以有一个表,它保存了我要包含在标题中的设置和值。当前只有一个附加项(即ReportChanges=true),但可能有多个项。该查询将如下所示:
<Application>
<Device AppEnabled="true" AsOf="06/03/2019 16:01:58 UTC" Name="MachineName">
<Groups>
<Group Name="Administrators" ReportChanges="true">
<Members>
<Member Name="AdminUser1" />
<Member Name="AdminUser2" />
<Member Name="AdminUser3" />
<Member Name="AdminUser4" />
</Members>
</Group>
<Group Name="Normal Users" ReportChanges="true">
<Members>
<Member Name="NormalUser1" />
<Member Name="NormalUser2" />
</Members>
</Group>
</Groups>
</Device>
</Application>
SELECT XMLSetting, XMLValue
FROM XMLItems;
我一直在修改一个查询中的“FOR XML”,它可以正确设置成员/成员组的格式,但如何添加所有其他层?您的格式需要相当多的嵌套级别。这样尝试一下(下次请以可消费的格式提供示例数据,就像我在这里使用DDL和INSERT所做的那样): 结果
<Application>
<Device AppEnabled="true" AsOf="2019-06-04T10:10:50.160" MachineName="blah">
<Groups>
<Group Name="Administrators" ReportChanges="true">
<Members>
<Member name="Admin1" />
<Member name="Admin2" />
</Members>
</Group>
<Group Name="Normal Users" ReportChanges="true">
<Members>
<Member name="user1" />
<Member name="user2" />
</Members>
</Group>
</Groups>
</Device>
</Application>
您需要使用嵌套查询(子查询),但是没有示例数据,这很难成为一个可以帮助您的示例。太棒了-谢谢您提供的信息-我一定会尝试一下!
WITH Groups AS
(
SELECT 'Administrators' AS GroupName
UNION ALL
SELECT 'Normal Users'
)
SELECT 'true' AS [@AppEnabled]
,GETDATE() AS [@AsOf]
,@ComputerName AS [@MachineName]
,(
SELECT GroupName AS [@name]
,'true' AS [@ReportChanges]
,(
SELECT names.*
FROM
(
SELECT UserName AS [@Name] FROM @AdminUsers WHERE GroupName='Administrators' AND Computer=@ComputerName
UNION ALL
SELECT UserName AS [@Name] FROM @NormalUsers WHERE GroupName='Normal Users' AND Computer=@ComputerName
) names
FOR XML PATH('Member'),TYPE
) AS Members
FROM Groups
FOR XML PATH('Group'),TYPE
) AS Groups
FOR XML PATH('Device'),ROOT('Application');