为什么我不能使用FOR XML EXPLICIT作为类型创建CDATA?

时间:2013-08-02 01:16:49

标签: sql-server xml

我目前有一个类似于以下的SQL语句(我已经删除了一些复杂性):

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

但是当我删除类型时,WHOLE内容元素的编码变为:

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

如何将查询结果保持为有效的xml值并删除type参数,以便正确地获得CDATA标记:

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

1 个答案:

答案 0 :(得分:1)

正如你所发现的那样。 XML CDATA Tag is lost when converting to XML data type

for xml path查询中使用子查询会将该子查询的结果更改为XML数据类型,无论您是否使用type指令。

我可以看到两个解决方法。更改整个查询以使用for xml explicit或对XML进行一些后处理字符串操作,以使用值的CDATA表示替换content节点的值。