我有一个这样的 XML 值:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
</R>
我想连接所有I
值并将它们作为单个字符串返回:ABC...
.
现在我知道我可以分解 XML,将结果聚合为无节点 XML,然后应用于.values('text()[1]', ...)
结果:
SELECT
(
SELECT
n.n.value('text()[1]', 'varchar(50)') AS [text()]
FROM
@MyXml.nodes('/R/I') AS n (n)
FOR XML
PATH (''),
TYPE
).value('text()[1]', 'varchar(50)')
;
但是,我只想使用 XPath/XQuery 方法来完成所有这些工作,如下所示:
SELECT @MyXml. ? ( ? );
有没有这样的方法?
我在这个方向寻找解决方案的原因是因为我的实际 XML 也包含其他元素,例如:
<R>
<I>A</I>
<I>B</I>
<I>C</I>
...
<J>X</J>
<J>Y</J>
<J>Z</J>
...
</R>
而且我希望能够将I
值提取为单个字符串并将J
值提取为单个字符串,而不必为每个值使用笨拙的脚本。
这可能对您有用:
text()
它从第一个R
和下面拾取所有元素。如果你只想
text()
做你能做的一切如果您想要 for
I
和J
分离的值,请改为执行此操作。根据您的实际 XML 结构,您可以考虑使用如下循环:
输出这个:
看到这个小提琴
如果您的元素和值确实很短且不同,则此方法有效:
但是,对于非平凡的 XML,它可能会遇到困难。