嗯,这是 - 据我所知 - 在正常方式下是不可能的......
CDATA 部分只有一个原因:在内为懒惰的人包含无效字符...
CDATA 根本不需要,因此通常的 XML 方法并不真正支持。或者换句话说:内容被正确转义的方式支持。实际上,CDATA 中正确转义的内容和未转义的内容之间没有区别! (好吧,有一些细微的区别,比如包括]]> 在 一个CDATA-section 和一些更小的专业......)
最大的问题是:为什么?
之后你想做什么?
试试这个。包含的文本原样:
DECLARE @xml XML =
'<root>
<special>
<event><![CDATA[text->text]]></event>
<event><![CDATA[text->text]]></event>
</special>
</root>'
SELECT t.c.query('text()')
FROM @xml.nodes('/root/special/event') t(c);
所以:请解释更多细节:你真正想要什么?
如果你真的只需要包装 CDATA 你可以使用这个:
SELECT '<![CDATA[' + t.c.value('.','varchar(max)') + ']]>'
FROM @xml.nodes('/root/special/event') t(c);
更新:与过时的FROM OPENXML相同
我刚刚尝试了FROM OPENXML 的过时方法如何处理这个问题,发现结果集中绝对没有迹象表明给定的 text 最初位于 CDATA 部分中。 “Some value here”的返回方式与CDATA中的文本完全相同:
DECLARE @doc XML =
'<root>
<child>Some value here </child>
<special>
<event><![CDATA[text->text]]></event>
<event><![CDATA[text->text]]></event>
</special>
</root>';
DECLARE @hnd INT;
EXEC sp_xml_preparedocument @hnd OUTPUT, @doc;
SELECT * FROM OPENXML (@hnd, '/root',0);
EXEC sp_xml_removedocument @hnd;