关于从SQL语句/过程生成的多层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

我正在研究如何获取SQL语句(以及如何从存储过程中获取)并从查询结果生成XML输出。我所追求的XML输出如下所示:

<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');