2

XMLがパラメーターとして渡されるストアドプロシージャがあり、そのxMLを読み取って、いくつかの更新を行う必要があります。XMLの形式は次のとおりです。

<Requests>
    <RequestReference>R12345</RequestReference>
    <Inventory InventoryId="1" InventoryName="I1">
        <RequestCodes>
            <Code>AAA</Code>
        </RequestCodes>
    </Inventory>
    <Inventory InventoryId="2" InventoryName="I2">
        <RequestCodes>
            <Code>BBB</Code>
            <Code>CCC</Code>
        </RequestCodes>
    </Inventory>
    <Inventory InventoryId="3" InventoryName="I3">
        <RequestCodes>
            <Code>DDD</Code>
            <Code>EEE</Code>
            <Code>FFF</Code>
        </RequestCodes>
    </Inventory>
</Requests>

次に、次のようなテーブルのXMLを読み取る必要があります。

RequestReference    InventoryId InventoryName           Code
R12345                    1           I1            AAA
R12345                    2           I2            BBB
R12345                    2           I2            CCC
R12345                    3           I3            DDD
R12345                    3           I3            EEE
R12345                    3           I3            FFF

私は次のようなことを試みています

SELECT 
    T.Item.value('@InventoryId', 'VARCHAR(3)')  AS InventoryId,
    T.Item.value('@InventoryName', 'VARCHAR(3)')    AS InventoryName,
    T.Item.value('RequestCodes[1]/Code[1]', 'VARCHAR(5)')   AS Code
FROM   
   @xmlDoc.nodes('Requests/Inventory') 
   AS T(Item)

それが生み出した結果は

InventoryId InventoryName   Code
1                 I1    AAA
2                 I2    BBB
3                 I3    DDD

したがって、これは機能しているように見えますが、目的の結果が完全には得られていません。

4

2 に答える 2

2

使用する:

select *
from
(
SELECT
    T.Item.value('../../../RequestReference[1]', 'VARCHAR(20)')  AS RequestReference,
    T.Item.value('../../@InventoryId', 'VARCHAR(3)')  AS InventoryId,
    T.Item.value('../../@InventoryName', 'VARCHAR(3)')    AS InventoryName,
    T.Item.value('.', 'VARCHAR(5)')   AS Code
FROM   
   @xmlDoc.nodes('//Code') 
   AS T(Item)
)t
order by InventoryId, InventoryName, Code
于 2012-07-22T11:16:41.467 に答える
2

これを試してください。アウターまたはクロスアプライのいずれかを使用できます

select
--ref.query('.'),
rr.rr.value('(.)[1]','varchar(20)') as RequestReference,
--inv.inv.query('.'),
inv.inv.value('(./@InventoryId)[1]','int') as InventoryId ,
inv.inv.value('(./@InventoryName)[1]','Varchar(20)') as InventoryName ,
rc.rc.value('(.)[1]','varchar(20)') as Codes
from 
@xml.nodes('Requests') rq(ref)
cross apply rq.ref.nodes('./Inventory') inv(inv)
cross apply inv.inv.nodes('./RequestCodes/Code') rc(rc)
cross apply rq.ref.nodes('./RequestReference') rr(rr)
于 2012-07-22T11:22:58.167 に答える