Sql server 对于具有两个父节点和多个子节点的XML结构?
我需要XML的结构如下:Sql server 对于具有两个父节点和多个子节点的XML结构?,sql-server,xml,Sql Server,Xml,我需要XML的结构如下: <Loans> <Loan> <GUID></GUID> <LoanFolder></LoanFolder> <LastModified></LastModified> <TotalMonthlyPayment></TotalMonthlyPayment> <Ag
<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数据的联盟是缺少的元素。谢谢