XQuery - รับโหนดเป็นสตริงรวมถึงแท็ก XML

ฉันมีคอลัมน์ XML ในตารางใน SQL Server 2008R2 XML มีลักษณะดังนี้ (ตัวอย่างแบบง่าย):

<root>
   ...
   <Filters>
       <Filter type="a">
          <Patterns>
              <Pattern>bla bla bla</Pattern>
              <Pattern>kuku</Pattern>
          </Patterns>
       </Filter>
       <Filter type="b">
           <Name>Cookie</Name>
       </Filter>
       <Filter type="c">
          <FileTypes>
              <FileType>exe</FileType>
              <FileType>jpg</FileType>
          </FileTypes>
       </Filter>
   </Filters>
   ...
</root>

กล่าวคือ สามารถกำหนดประเภทตัวกรองได้หลายประเภท และทุกประเภทมีองค์ประกอบย่อยที่ไม่ซ้ำกัน ฉันต้องการเขียนแบบสอบถามที่จะส่งคืนสตริงต่อไปนี้:

Filter Type: a
Configuration:
    <Patterns>
        <Pattern>bla bla bla</Pattern>
        <Pattern>kuku</Pattern>
    </Patterns>

Filter Type: b
Configuration:
    <Name>Cookie</Name>

Filter Type: c
Configuration:
    <FileTypes>
        <FileType>exe</FileType>
        <FileType>jpg</FileType>
    </FileTypes>

สิ่งที่ฉันมีจนถึงตอนนี้คือ:

SELECT
   xmlFiled.query(
     let $nl := "&#10;"
     let $space := "&#32;"
     let $tab := concat($space, $space, $space, $space)
     for $f in /root/.../Filters/Filter 
     return concat("Filter Type: ", $f/@type, $nl, "Configuration:", $nl, $tab, $f/node()[1], $nl)'
     ) AS Filters, 
FROM Table

ปัญหาคือการแปลงสตริงของ $f/node()[1] เชื่อมต่อข้อความในองค์ประกอบภายในทั้งหมดของโหนดโดยไม่เก็บแท็ก XML ดังนั้นผลลัพธ์ที่ฉันได้รับคือ:

Filter Type: a
Configuration:
    bla bla blakuku

Filter Type: b
Configuration:
    Cookie

Filter Type: c
Configuration:
    exejpg

เป็นไปได้ไหมที่จะบรรลุสิ่งที่ฉันต้องการด้วยวิธีนี้?


person user1039580    schedule 06.08.2012    source แหล่งที่มา
comment
คุณควรยอมรับคำตอบที่ตรงกับความต้องการของคุณมากที่สุด   -  person    schedule 09.08.2012


คำตอบ (1)


อีกวิธีหนึ่งเพื่อให้ได้ผลลัพธ์ที่คุณต้องการ

declare @T table(xmlFiled xml)

insert into @T values
('<root>
   <Filters>
       <Filter type="a">
          <Patterns>
              <Pattern>bla bla bla</Pattern>
              <Pattern>kuku</Pattern>
          </Patterns>
       </Filter>
       <Filter type="b">
           <Name>Cookie</Name>
       </Filter>
       <Filter type="c">
          <FileTypes>
              <FileType>exe</FileType>
              <FileType>jpg</FileType>
          </FileTypes>
       </Filter>
   </Filters>
</root>')

select stuff((
             select char(10)+char(10)+'Filter Type: '+F.N.value('@type', 'char(1)')+char(10)+
                    'Configuration:'+char(10)+space(4),
                    F.N.query('*')
             from T.xmlFiled.nodes('/root/Filters/Filter') as F(N)
             for xml path('')
             ), 1, 2, '')
from @T as T

ผลลัพธ์:

Filter Type: a
Configuration:
    <Patterns><Pattern>bla bla bla</Pattern><Pattern>kuku</Pattern></Patterns>

Filter Type: b
Configuration:
    <Name>Cookie</Name>

Filter Type: c
Configuration:
    <FileTypes><FileType>exe</FileType><FileType>jpg</FileTyp
person Mikael Eriksson    schedule 06.08.2012
comment
ขอบคุณสำหรับการตอบรับ ฉันเลือกที่จะไม่ใช้ xmlField.nodes() และใช้ xmlFields.query(...) เนื่องจากฉันเลือกค่าจากคอลัมน์ที่แตกต่างกันในตารางอื่นที่ไม่ใช่เขตข้อมูล XML ดังนั้นฉันจึงต้องการให้ส่วนคำสั่ง FOR เป็นตารางเอง - person user1039580; 07.08.2012