我目前有一个类似于以下的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="">
<content> 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>
答案 0 :(得分:1)
正如你所发现的那样。 XML CDATA Tag is lost when converting to XML data type
在for xml path
查询中使用子查询会将该子查询的结果更改为XML数据类型,无论您是否使用type
指令。
我可以看到两个解决方法。更改整个查询以使用for xml explicit
或对XML进行一些后处理字符串操作,以使用值的CDATA表示替换content
节点的值。