2010-03-01 107 views
3

使用MSSQL 2008年和XQuery如何將XML的嵌套層次結構轉換爲SQL表

考慮存儲在一個表中的下列XML:

<ROOT> 
    <WrapperElement> 
    <ParentElement ID=1> 
     <Title>parent1</Title> 
     <Description /> 
     <ChildElement ID="6"> 
     <Title>Child 4</Title> 
     <Description /> 
     <StartDate>2010-01-25T00:00:00</StartDate> 
     <EndDate>2010-01-25T00:00:00</EndDate> 
     </ChildElement> 
     <ChildElement ID="0"> 
     <Title>Child1</Title> 
     <Description /> 
     <StartDate>2010-01-25T00:00:00</StartDate> 
     <EndDate>2010-01-25T00:00:00</EndDate> 
     </ChildElement> 
     <ChildElement ID="8"> 
     <Title>Child6</Title> 
     <Description /> 
     <StartDate>2010-01-25T00:00:00</StartDate> 
     <EndDate>2010-01-25T00:00:00</EndDate> 
     </ChildElement> 
    </ParentElement> 
    </WrapperElement> 
</Root> 

我想分解這個XML轉換成類似

PE!ID | PE!Title | PE!Description | CE!ID | CE!Title | CE!StartDate |... 
1  | parent1 |    | 6  | child 4 | 2010-... | 
1  | parent1 |    | 0  | child1 | 2010-... | 

注意:每個ParentElement可能有很多ChildElement,在這個e xample。 我一直在使用xquery進行試驗,但是我一直無法通過複雜的元素進行導航。

基本上,我試圖做一些與FOR XML對錶做的完全相反的事情,只是用一個更簡單的數據集來處理。

關於下一步該怎麼做或如何完成此任何想法?

感謝

+0

XML是使用文本(varchar/etc)還是XML數據類型存儲的? –

回答

6

這個怎麼樣(我宣佈@input要與你的XML內容的XML數據類型變量 - 相應的更換):

SELECT 
    Parent.Elm.value('(@ID)[1]', 'int') AS 'ID', 
    Parent.Elm.value('(Title)[1]', 'varchar(100)') AS 'Title', 
    Parent.Elm.value('(Description)[1]', 'varchar(100)') AS 'Description', 
    Child.Elm.value('(@ID)[1]', 'int') AS 'ChildID', 
    Child.Elm.value('(Title)[1]', 'varchar(100)') AS 'ChildTitle', 
    Child.Elm.value('(StartDate)[1]', 'DATETIME') AS 'StartDate', 
    Child.Elm.value('(EndDate)[1]', 'DATETIME') AS 'EndDate' 
FROM 
    @input.nodes('/ROOT/WrapperElement/ParentElement') AS Parent(Elm) 
CROSS APPLY 
    Parent.Elm.nodes('ChildElement') AS Child(Elm) 

你基本上遍歷所有的/ROOT/WrapperElement/ParentElemet節點(如Parent(Elm)僞表),然後對於每個條目,然後爲ParentElement中包含的子元素執行CROSS APPLY並提取必要的信息。

應該工作 - 我希望!

相關問題