2013-08-02 55 views
2

我現在有類似以下內容的SQL語句(我已經刪除了一些複雜性):爲什麼我無法使用FOR XML EXPLICIT作爲Type時創建CDATA?

SELECT 
Name as '@name' 
,(
    SELECT foo.Name as '@name', foo.Key as '@key' 
    FROM foo 
    FOR XML Path('foo'), root ('foos'), type 
) 
,(
    SELECT 
     1 as Tag 
     ,null as Parent 
     ,bar.Name as 'bar!1!name' 
     ,bar.Key as 'bar!1!key' 
     ,bar.Content as 'bar!1!!cdata' 
    FROM bar 
    FOR XML EXPLICIT, root ('bars'), type 
) 
FROM baz 
FOR XML Path('baz'), root ('bazzes') 

此查詢的結果是一個很好的XML值如下所示:

<bazzes> 
    <baz name=""> 
     <foos> 
      <foo name="" key=""> 
      </foo> 
     </foos> 
     <bars> 
      <bar name="" key=""> 
      <content>the content</content> 
      </bar> 
     </bars> 
    </baz> 
</bazzes> 

請注意,content元素沒有按預期的那樣具有CDATA標記,我知道這是因爲我已將其指定爲type

但是當我刪除的類型,其全部內容元素得到的編碼變成:

<bazzes> 
    <baz name=""> 
     <foos> 
      <foo name="" key=""> 
      </foo> 
     </foos> 
     <bars> 
      <bar name="" key=""> 
      &lt;content&gt; etc. 
      </bar> 
     </bars> 
    </baz> 
</bazzes> 

我如何才能讓查詢的結果是有效的XML值,並移除類型參數,所以我得到的CDATA標記正確成爲:

<bazzes> 
     <baz name=""> 
      <foos> 
       <foo name="" key=""> 
       </foo> 
      </foos> 
      <bars> 
       <bar name="" key=""> 
       <content><![CDATA[the content]]></content> 
       </bar> 
      </bars> 
     </baz> 
    </bazzes> 

回答

1

正如您發現的那樣。 XML CDATA Tag is lost when converting to XML data type

使用在for xml path查詢子查詢,如果您使用type指令或不將改變該子查詢XML數據類型的結果不管。

我可以看到兩種解決方法。將整個查詢更改爲使用for xml explicit或對XML執行一些後處理字符串處理,以便用值的CDATA表示替換content節點的值。

+1

謝謝你,我發現sqlserver對數據進行編碼並刪除了cdata標記,這實際上可以滿足我的需求,所以危機避免了! – shenku

相關問題