如何使用sql从同一级别的所有xml元素中选择属性

时间:2019-06-12 16:00:54

标签: sql sql-server tsql

我的xml是:

<foo>
    <bar>
        <button text="a"/>
        <button text="b"/>
        <button text="c"/>
    </bar>
</foo>

使用以下命令,我可以获取这些文本值之一,但我尝试将所有三个值都取回来(每个都在自己的行上)。我意识到[1]是为什么我要找回来的原因...但是我不确定如何将他们找回来?

select 
    cast(f.xml as xml).value('(/foo/bar/button/@text)[1]', 'varchar(max)') as foo
from
    (select top 1 * from files) f

这将返回

Foo
---
 a

我实际上想要去的地方

Foo
---
 a
 b
 c

2 个答案:

答案 0 :(得分:1)

您需要在nodes中使用FROM运算符,可以通过使用CROSS APPLY来完成此操作:

DECLARE @XML xml = '
<foo>
    <bar>
        <button text="a"/>
        <button text="b"/>
        <button text="c"/>
    </bar>
</foo>';

SELECT fb.button.value('@text','char(1)')
FROM (VALUES(@XML))X(XMLString)
     CROSS APPLY X.XMLSTRING.nodes('foo/bar/button') fb(button);

答案 1 :(得分:1)

我认为此查询可以解决问题:

declare @xml as xml = 
'<foo>
    <bar>
        <button text="a"/>
        <button text="b"/>
        <button text="c"/>
    </bar>
</foo>'

select T.C.value('@text','varchar(50)') as button
FROM @xml.nodes('/foo/bar/button') as T(C)

output