2010-08-04 108 views
2

我有這樣的XML在SQL Server表:的XQuery VS的OpenXML在SQL Server

<root> 
    <meetings> 
    <meeting> 
     <id>111</id> 
     <participants> 
     <participant><name>Smith</name></participant> 
     <participant><name>Jones</name></participant> 
     <participant><name>Brown</name></participant> 
     </participants> 
    </meeting> 
    <meeting> 
     <id>222</id> 
     <participants> 
     <participant><name>White</name></participant> 
     <participant><name>Bloggs</name></participant> 
     <participant><name>McDonald</name></participant> 
     </participants> 
    </meeting> 
    </meetings> 
</root> 

而想要一個結果集是這樣的:

MeetingID Name 
111   Smith 
111   Jones 
111   Brown 
222   White 
222   Bloggs 
222   McDonald 

這是很容易使用select from openxml但我用失敗XQuery的。有人可以幫助我,也可以給任何方法的優點和缺點?

回答

4

一旦你固定您的無效XML(在<name>元素需要用</name>結束標記結束),你應該能夠使用:

SELECT 
    Meetings.List.value('(id)[1]', 'int') AS 'Meeting ID', 
    Meeting.Participant.value('(name)[1]', 'varchar(50)') AS 'Name' 
FROM 
    @input.nodes('/root/meetings/meeting') AS Meetings(List) 
CROSS APPLY 
    Meetings.List.nodes('participants/participant') AS Meeting(Participant) 

基本上,.nodes()第一個電話給你是一個所有<meeting>節點的僞表,從中提取會議ID。

第二個.nodes()調用該<meeting>標籤深入挖掘<participants>/<participant>子節點列表並從這些節點中提取名稱。

+0

謝謝,正是我所需要的。但我發現openXML語法更易於理解。 – Graeme 2010-08-04 15:09:46

+0

@Graeme:真的嗎?實際上,我發現OpenXML非常不直觀且相當混亂。 – 2010-08-04 15:18:53

1

這可能會爲您提供基於XQuery的基於表格的輸出。

(: Assume $x is your Xml Content. so :) 
let $x := Assign your Xml Content. 
let $d1:= <table border="1"><tr><td>Meeting</td><td> Participant</td></tr> 
    { for $p in $x//meeting/participants/participant 
       return element{'tr'} { 
        element{'td'} {$p/parent::*/parent::*/id/text()}, 
        element{'td'} {data($p)}       
       } 
      } 

    </table>