2009-04-16 4 views
1

내가 필요한 것은 CROSS APPLY이지만 구문을 이해할 수없는 것 같습니다.MSSQL에서 XML 부모와 자식 믹스

Cookie Name     Cookie SubName 
___________     ______________ 
Chocolate Chip    <null> 
Chocolate Chip    ChocolateChipPeanutButter 
Chocolate Chip    ChocolateChipPecan 
Raisin      <null> 
Coconut      <null> 
Sugar       <null> 
: 나는 다음과 같습니다 결과 세트를 가질 수 있도록 XML을 잘라하기 위해 노력하고있어

<Cookie> 
    <id>Chocolate Chip</id> 
    <ChocolateChipPeanutButter> 
     ... 
    </ChocolateChipPeanutButter> 

    <ChocolateChipPecan> 
     ... 
    </ChocolateChipPecan> 
</Cookie> 

<Cookie> 
    <id>Raisin</id> 
</Cookie> 

<Cookie> 
    <id>Coconut</id> 
</Cookie> 

<Cookie> 
    <id>Sugar</id> 
</Cookie> 

: 나는 MSSQL에서 다음과 같습니다 2008 데이터베이스를 XML의 세트가

은 내가 (다음처럼 작성할 XML 데이터가DECLARE의 @XMLData의 XML에 저장되어 가정 할 필요가 있다고 생각 :

SELECT 
    TheXML.TheCookie.query('data(./id)')  AS CookieName 
    , TheXML.TheCookie.query('.')    AS CookieData 
    , Sub.SubCookieName      AS SubCookieName 
FROM 
    @XMLData.nodes('//Cookie') AS TheXML(TheCookie) 
CROSS APPLY 
    (
     SELECT 
      TheCookieXML.SubCookieName.query('local-name(.)') 
     FROM 
      CookieData.nodes('./*') AS TheCookieXML(SubCookieName) 
    ) 

가 나는, 나 알고있다 알고있다,이 XML 스키마에 대한 끔찍한 내가 그걸로 뭘 하려는지,하지만 우리가 이런 식으로 데이터에 집착하고 거기에서 일한다고 가정 할 수 있습니다. 나는 올바른 길을 가고 있는가? CROSS가 이렇게 작동할까요? 배트맨도 나를 구할 수 있습니까?

+0

프로토 타입의 마이크로 소프트의 쿠키 마스터 2010 어쩌면 :-) –

답변

2

이 같은 것을보십시오 :

SELECT 
    TheXML.TheCookie.value('(id[1])', 'varchar(20)') AS CookieName 
    , TheXML.TheCookie.query('.') AS CookieData 
    , Sub.SubCookie.value('local-name(.)', 'varchar(20)') AS SubCookieName 
FROM 
    @xmlcon.nodes('//Cookie') AS TheXML(TheCookie) 
CROSS APPLY 
    TheXML.TheCookie.nodes('./*') as Sub(SubCookie) 

문제입니다 - 이것은 또한

:-(은 "아이디"노드를 선택 마크

+0

? TheXML.TheCookie.nodes ('./* [local-name()! ='id ']) Sub (SubCookie) – Tomalak

+0

완벽한, 고마워요! – brian

+2

코멘트의 세 번째 시도 ... 위의 내용은 심각한 문제가 아닌 작은 따옴표가 포함되어 있습니다. 대안, 단순한 XPath : TheXML.TheCookie.nodes ('./* [자기 (self :: id)가 아님]) – Tomalak