2016-01-22 68 views
1

我需要的XML進行結構是這樣的:對於具有兩個父節點和多個子節點的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> 

我有一個FOR XML查詢的結構是這樣的:

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「根節點。我如何添加這個根節點? http://sqlfiddle.com/#!6/d672a/2/0

注:我能使用這個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> 
+0

您能提供http://sqlfiddle.com/中的示例數據嗎?僅供參考,[提出一個好的結構化查詢語言(SQL)問題](http://meta.stackoverflow.com/a/271056/2998271) – har07

+0

在這裏,你去 - 希望這有助於。 http://sqlfiddle.com/#!6/d672a/2/0 – dc922

+0

嗯,我沒有弄清楚如何用FOR XML做到這一點,但我能夠應用XSL。 – dc922

回答

1

這是一個可能的SQL查詢,根據您的SQL小提琴表結構建成,將生產所需的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') 

sqlfiddle demo

基本上,內FOR XML PATH將返回LoanSecondaryStatus元件包裹在一個LoanSecondaryStatusDates母體,並用於產生LoanSecondaryStatus數據UNION子句。除此之外,上述查詢中看到的所有轉換都需要使UNION的雙方返回兼容數據類型,否則查詢將終止並顯示轉換錯誤。

+0

不錯。我認爲工會產生LoanSecondaryStatus數據是缺失的元素。謝謝! – dc922