내가 XML 열을 구문 분석을 시도하고 노드의 여러 하위 노드를 통해 두 가지SQL 서버 2012 : 다음 하위 노드 중 하나뿐만 아니라 CONCAT 모든 하위 노드를 선택 XML 파싱
- 으로 반복을하고 선택하는 것을 시도하고있다 하나의 노드는 1/0 플래그 값을 기반으로합니다. 그러나
IsActive PID PublicWorkPhone location -------- ----- --------------- -------- 1 111 (101)111-1111 NULL 1 222 NULL NULL 1 333 NULL NY
:이 얻을
create table #temp (XMLData xml) insert into #temp (XMLData) values (' <Report_Data> <Report_Entry> <IsActive>1</IsActive> <PID>111</PID> <Languages> <Language>German</Language> <speak>Y</speak> <read>Y</read> <write>Y</write> </Languages> <Languages> <Language>Spanish</Language> <speak>Y</speak> <read>N</read> <write>N</write> </Languages> <phone> <PhoneNumber>(101)111-1111</PhoneNumber> <PhoneType>Work</PhoneType> <IsPrimary>1</IsPrimary> </phone> <phone> <PhoneNumber>(101)111-2222</PhoneNumber> <PhoneType>Mobile</PhoneType> <IsPrimary>0</IsPrimary> </phone> </Report_Entry> <Report_Entry> <IsActive>1</IsActive> <PID>222</PID> <phone> <PhoneNumber>(101)222-1111</PhoneNumber> <PhoneType>Mobile</PhoneType> <IsPrimary>0</IsPrimary> </phone> </Report_Entry> <Report_Entry> <IsActive>1</IsActive> <PID>333</PID> <phone> <PhoneNumber>(101)333-1111</PhoneNumber> <PhoneType>Phone</PhoneType> <IsPrimary>0</IsPrimary> </phone> <phone> <PhoneNumber>(101)333-2222</PhoneNumber> <PhoneType>Mobile</PhoneType> <IsPrimary>1</IsPrimary> </phone> <location> <location-state>NY</location-state> </location> <location> <location-state>DC</location-state> </location> </Report_Entry> </Report_Data> ') select c.value('IsActive[1]','varchar(1)') as IsActive , c.value('PID[1]','varchar(5)') as PID , case when c.value('phone[1]/IsPrimary[1]','int') = 1 then c.value('phone[1]/PhoneNumber[1]','varchar(15)') end as PublicWorkPhone /** this condition needs to look at all sub nodes. this stops at the first one. **/ , c.value('location[1]','varchar(2)') as location from #temp cross apply #temp.XMLData.nodes('/Report_Data/Report_Entry') as y(c) drop table #temp GO
: SQL 서버 2012-
- 은 (분리) 한 결합 필드
의 Runnable 코드 블록을 생성하는 모든 하위 노드를 결합 필요합니다 :
IsActive PID PublicWorkPhone location
-------- ----- --------------- --------
1 111 (101)111-1111 NULL
1 222 NULL NULL
1 333 (101)333-2222 NY,DC
PID가 333 인 경우 기본 전화는 (101)333-2222이며 null이 아닙니다. 또한 해당 위치는 NY가 아닌 "NY, DC"여야합니다.
결과를 얻을 수있는 도움을 주시면 감사하겠습니다. 는
이것은 좋은 질문입니다. 복사 가능한 테스트 시나리오, 자체 노력, 잘못된 출력, 예상 출력. 내 측면에서 +1 – Shnugo
@ Shnugo, 고마워! – sch