Как выбрать атрибут из всех элементов XML на одном уровне с SQL - PullRequest
0 голосов
/ 12 июня 2019

Мой xml:

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

С помощью следующего я могу получить одно из этих текстовых значений, но я пытаюсь вернуть все 3 (каждый в своей строке).Я понимаю, [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 ]

1 голос
/ 12 июня 2019

Я думаю, что этот запрос помогает:

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

1 голос
/ 12 июня 2019

Вам необходимо использовать оператор 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...