سؤال

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