Sql server 对于具有两个父节点和多个子节点的XML结构?

Sql server 对于具有两个父节点和多个子节点的XML结构?,sql-server,xml,Sql Server,Xml,我需要XML的结构如下: <Loans> <Loan> <GUID></GUID> <LoanFolder></LoanFolder> <LastModified></LastModified> <TotalMonthlyPayment></TotalMonthlyPayment> <Ag

我需要XML的结构如下:

   <Loans>
    <Loan>
       <GUID></GUID>
       <LoanFolder></LoanFolder>
       <LastModified></LastModified>
       <TotalMonthlyPayment></TotalMonthlyPayment>
       <AgentCompanyName></AgentCompanyName>
    <LoanSecondaryStatusDates>
       <LoanSecondaryStatus>
          <StatusName>Name</StatusName>
          <StatusDate>Date</StatusDate>
        </LoanSecondaryStatus>
       <LoanSecondaryStatus>
        <StatusName>Name</StatusName>
        <StatusDate>Date</StatusDate>
       </LoanSecondaryStatus>
    </LoanSecondaryStatusDates>
 </Loan>
</Loans>
    SELECT 
  [GUID] 
  ,[LOANFOLDER]
  ,[LASTMODIFIED]
  ,[LASTIMPORTED]
  ,[TotalMonthlyPayment]
  ,[AgentCompanyName],
   (
   SELECT 
    'Borrower Docs Sent/Req' as 'StatusName',
    CASE WHEN t.BorrowerDocsSent IS NOT NULL THEN t.BorrowerDocsSent ELSE '' END as 'StatusDate'

FROM Encompass_loanData as t
WHERE t.[GUID] = E.[GUID]
FOR XML PATH('LoanSecondaryStatus'), TYPE
  ),
  (
   SELECT 
    t.BorrowerCity as 'StatusName',
    t.[GUID] as 'StatusDate'

FROM Encompass_loanData as t
WHERE t.[GUID] = E.[GUID]
FOR XML PATH('LoanSecondaryStatus'), TYPE
  )

From Encompass_loanData E
WHERE [LASTMODIFIED] >= '20160121'
FOR XML PATH ('Loan'), type, root('Loans')
这让我很接近,但缺少顶部的“LoanSecondaryStatusDates”根节点。如何将此根节点添加到中

注意:我能够使用以下XSL添加节点:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Loan">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()[not(self::LoanSecondaryStatus)]"/>
            <LoanSecondaryStatusDates>
                <xsl:apply-templates select="LoanSecondaryStatus"/>
            </LoanSecondaryStatusDates>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

这是一个可能的SQL查询,根据SQL FIDLE表结构构建,将生成所需的XML格式:

SELECT 
       [GUID] 
      ,[LOANFOLDER]
      ,[LASTMODIFIED]
      ,[LASTIMPORTED]
      ,[TotalMonthlyPayment]
      ,[AgentCompanyName]
      ,(
        SELECT * FROM
        (
            SELECT 
                CONVERT(VARCHAR(100), t.TotalMonthlyPayment) as 'StatusName',
                t.[GUID] as 'StatusDate'

            FROM [Sample] as t
            WHERE t.[GUID] = E.[GUID]
            UNION
            SELECT 
                'Borrower Docs Sent/Req' as 'StatusName',
                CASE WHEN t.LastModified IS NOT NULL THEN CONVERT(VARCHAR(25), t.LastModified, 126) ELSE '' END as 'StatusDate'

            FROM [Sample] as t
            WHERE t.[GUID] = E.[GUID]
        ) AS s
        FOR XML PATH('LoanSecondaryStatus'), TYPE, root('LoanSecondaryStatusDates')
       )

From [Sample] E
FOR XML PATH ('Loan'), type, root('Loans')


基本上,XML路径的内部
将返回
LoanSecondaryStatus
元素,这些元素封装在一个
LoanSecondaryStatusDates
父元素中,并返回一个用于生成
LoanSecondaryStatus
数据的
UNION
子句。除此之外,上述查询中看到的所有转换都需要使
联合的两侧返回兼容的数据类型,否则查询将以转换错误终止。

您能在中提供示例数据吗?仅供参考,给你-希望这有帮助。我没有弄清楚如何使用FOR XML实现这一点,但我能够应用XSL.NET来生成所需的XML结构。我认为生成LoanSecondaryStatus数据的联盟是缺少的元素。谢谢