Вопрос

How would I specify the following XML Hierarchy into readable columns in Microsoft SQL?

<transaction id=1>
    <item id=1>
        <price>1</price>
    </item>
    <item id=2>
        <price>1</price>
    </item>
</transaction>
<transaction>
    <item id=1>
        <price>1</price>
    </item>
</transaction>

for instance

select
    x.i.value('(????)','Varchar(max)') [TransId]
    x.i.value('(????)','Varchar(max)') [ItemId]
    x.i.value('(????)','Varchar(max)') [PriceId]
from @xml.nodes('/transaction') x(i)

Thanks in advance.

Это было полезно?

Решение 2

Actually usually it's faster to shred XML from parent to child using apply, like this:

select
    t.c.value('@id','int') as TransId,
    i.c.value('@id','int') as ItemId,
    i.c.value('(price/text())[1]', 'int') as PriceId
from @xml.nodes('transaction') as t(c)
    outer apply t.c.nodes('item') as i(c)
order by TransId, ItemID

sql fiddle demo

Другие советы

Attribute values must always appear in quotation marks in XML. Not sure about the desired output. An example would be:

declare @xml xml
Select @xml=
'<transaction id="1">
    <item id="1">
        <price>1</price>
    </item>
    <item id="2">
        <price>2</price>
    </item>
</transaction>
<transaction>
    <item id="1">
        <price>3</price>
    </item>
</transaction>'

SELECT
    y.value('../@id','int') as TransactionID,
    y.value('@id','int') as ItemID,
    y.value('(./price/text())[1]', 'Varchar(max)') as Price
FROM @xml.nodes('/transaction/item') as x(y)
order by TransactionID,ItemID

with the output:

NULL    1   3
1       1   1
1       2   2
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top