2012-05-31 4 views
0

는 다음과 같은 XML 파일을 고려는 분쇄 XML 조건부은 SQL Server의

나는 '분쇄기'는 XML 다음 표에 (의 XPath/XQuery를 사용) 할 필요가
<?xml version="1.0" encoding="ISO-8859-1"?> 
<Input Control="1234567890"> 
    <Patient> 
     <AccountID>[email protected]</AccountID> 
     <Name> 
     <Title>Mr</Title> 
     <First>John</First> 
     <Middle>J</Middle> 
     <Last>Smith</Last> 
     </Name> 
     <Addresses> 
     <Address Type="Billing"> 
      <Line1>123 Main St</Line1> 
      <Line2>Unit #1</Line2> 
      <City>Anytown</City> 
      <State>MD</State> 
      <PostalCode>78470</PostalCode> 
      <Country>USA</Country> 
      <Zone>TR89</Zone> 
     <Address Type="Contact"> 
      <Line1>55 Main St</Line1> 
      <City>Anytown</City> 
      <State>MD</State> 
      <PostalCode>78470</PostalCode> 
      <Country>USA</Country> 
      <Zone>TR89</Zone> 
     </Address> 
     </Addresses> 
     <Phones> 
     <Phone Type="Daytime">555-221-2525</Phone> 
     <Phone Type="Evening">555-355-1010</Phone> 
     </Phones> 
     <Selects> 
     <Select Name="Current">0</Select> 
     </Selects> 
    </Patient> 
</Input> 

:

Account Nam_Pr Nam_Fst Nam_Lst Adrs1Main Adrs2Main CityMain ... 
    1  Mr.  John  Smith 123 Main St Unit #1 Anytown 

문제 주소 유형 = "청구서 수신 요소가 파일에있는 경우에만 AdrsMain 필드에 채울 필요가 있습니다. 그렇지 않으면 AdrsMain 필드가 주소 유형 ="연락처 "요소에서 채워집니다. 어떻게 수행 할 수 있습니까? 이건?

+0

... 미안 해요. 좋은 출발점이 있다면 XML을 파쇄하는 것이 그리 어렵지는 않습니다. 그게 네가 필요한거야? 사용할 수있는 모든 가치를 얻었 으면 조건을 충족시키기 위해 적절한 값을 함께 사용할 수 있어야합니다. – JayC

답변

1

내가 상상 한 것보다 조금 더 힘들었 기 때문에이 메시지에 답해 보겠습니다. 나는 xquery를 null로 변환 할 필요가있는 속성으로부터 리턴 된 값이 이미 null 이었기 때문에 생각하지 않습니다. 이 때문에 빈 문자열을 다시 null로 변환해야 할 수도 있습니다. 다행히도 멋진 연산자가 nullif이라는 것을 알았습니다.

하지만 여기에 아이디어가 있습니다.

create table docs (id int primary key, xmlbit xml); 

는 문서 파일 을 추가한다고 가정하고 당신이 할 수있는

with things (BillingLine1,ContactLine1) as 
(
SELECT 
nullif(cast(xmlbit.query('data(/Input/Patient/Addresses/Address[@Type="Billing"]/Line1)') as varchar(100)),'') as BillingLine1, 
nullif(cast(xmlbit.query('data(/Input/Patient/Addresses/Address[@Type="Contact"]/Line1)') as varchar(100)),'') as ContactLine1 
from docs 
) 
select BillingLine1, ContactLine1, Coalesce(BillingLine1, ContactLine1) as needed from things; 

데모 : http://sqlfiddle.com/#!3/b3fbd/15이 작업을 수행 할 수있는 다른 방법이 아마 있습니다

. 당신이 정말로 원한다면 나는 xquery/xpath 문장 내에서 모든 것을 할 수 있고 심지어 유리할 수도 있다는 느낌이 들지만 확실하지는 않습니다.

편집 : 제발 varchars의 크기를 메모 해주세요. 너는 적합을보기 위하여 조정할 필요가있을 수도있다.