2012-07-22 4 views
2

XML을 매개 변수로 전달하는 저장 프로 시저가 있습니다. 그런 다음 해당 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> 

가 지금은

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) 

뭔가를 시도하고 같은 테이블에 XML을 읽을 필요가있다

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

원하는 결과를 완벽하게 생성하지 못합니다.

+0

결과는 무엇을 적용? –

답변

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 
+0

Brilliant ....... –

+0

XML 노드를 백 트레이싱한다고 생각한 적은 한 번도 없었습니다. –

+0

@ Nadeem, 오신 것을 환영합니다! –

2

이 this.You는 외부 또는 상호를 사용할 수 있습니다 시도는

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)