2013-10-12 3 views
1

을 적용 절단하지 수 있습니까 @xdata라는 VAR에서 XML 데이터를크로스와 XML 데이터를 XML 조각을 감안할 때

<VehicleFeed> 
    <Vehicle> 
    <VIN>1234</VIN> 
    <Equipment> 
     <EquipmentDesc>1.1</EquipmentDesc> 
     <EquipmentDesc>1.2</EquipmentDesc> 
     <EquipmentDesc>1.3</EquipmentDesc> 
    </Equipment> 
    </Vehicle> 
    <Vehicle> 
    <VIN>2345</VIN> 
    <Equipment> 
     <EquipmentDesc>2.1</EquipmentDesc> 
     <EquipmentDesc>2.2</EquipmentDesc> 
     <EquipmentDesc>2.3</EquipmentDesc> 
    </Equipment> 
    </Vehicle> 
</VehicleFeed> 

What I really want is this result set 

VIN EquipmentDesc 
--- ------------- 
1234 1.1 
1234 1.2 
1234 1.3 
2345 2.1 
2345 2.2 
2345 2.3 

(빈스는 분명히 가짜입니다). 아래 코드는 작동 할 것이라고 생각하지만, 모든 장비 값을 행으로 분리하는 대신 데이터의 단일 열로 연결합니다.

select t.c.value('VIN[1]', 'varchar(20)') as VIN 
    , t1.c1.value('.', 'varchar(80)') as EquipDesc 
from @xdata.nodes('//VehicleFeed/Vehicle') as t(c) 
cross apply t.c.nodes('Equipment') as t1(c1) 

즉, 나는 분명히 아마도 십자가에 적용, 뭔가 잘못하고있는 중이 야

VIN EquipmentDesc 
--- ------------- 
1234 1.11.21.3 
2345 2.12.22.3 

지고, 또는 설명 데이터 (또는 둘 다)의 선택,하지만 난 모르는거야 그것이 무엇인지. 이게 단순한 것처럼 보였지만 나는 그것을 보지 않고있다.

답변

1

나는 그 대답을 나중에 깨달았다. 나는 토요일 저녁에 코딩하는 뇌의 손상 인 EquipmentDesc 요소로 내려 가기 위해 더 많은 크로스 적용을 추가해야했습니다.

cross apply t1.c1.nodes('EquipmentDesc') as t2(c2) 

그리고 너무 자주 적용 십자가를 사용하지 않는

, t2.c2.value('.', 'varchar(80)') as EquipDesc 

를 사용하여 장비 설명 값을 선택, 쉽게 내가 몇 가지 기존 코드를 조정할 때 정말 무엇을 의미하는지 잊지. 미안 누군가 시간 낭비하면.

최종 쿼리 (관련 부분 적어도)

추가

select t.c.value('VIN[1]', 'varchar(20)') as VIN 
    , t2.c2.value('.', 'varchar(80)') as EquipDesc 
from @xdata.nodes('//VehicleFeed/Vehicle') as t(c) 
cross apply t.c.nodes('Equipment') as t1(c1) 
cross apply t1.c1.nodes('EquipmentDesc') as t2(c2) 
+0

전체 수정 쿼리를 게시하시기 바랍니다. 적어도 귀하의 질문에 게시 한 금액을 수정하십시오. –

1

당신은 짧은 문장과 같은 얻을 수 있습니다

select t.c.value('../../VIN[1]', 'varchar(20)') as VIN 
    , t.c.value('.', 'varchar(80)') as EquipDesc 
from @xdata.nodes('/VehicleFeed/Vehicle/Equipment/EquipmentDesc') as t(c); 
+0

물론 중급 수준도 사용하지 않았습니까? 최종 행에서 완전한 xpath를 반복하지는 않겠지 만. 알림을 주셔서 감사합니다, 나는 다른 사람이 이것으로부터 배울 것이라고 생각합니다. +1 –

관련 문제