XQuery - Dapatkan simpul sebagai string termasuk tag XML

Saya memiliki kolom XML dalam tabel di SQL server 2008R2. XMLnya terlihat seperti ini (contoh sederhana):

<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>

yaitu ada banyak tipe filter yang ditentukan dan setiap tipe memiliki elemen turunan yang unik. Saya ingin menulis kueri yang akan mengembalikan string berikut:

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>

Apa yang saya miliki sejauh ini adalah:

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

Masalahnya adalah konversi string $f/node()[1] menggabungkan teks di semua elemen dalam node tanpa menyimpan tag XML, jadi hasil yang saya dapatkan adalah ini:

Filter Type: a
Configuration:
    bla bla blakuku

Filter Type: b
Configuration:
    Cookie

Filter Type: c
Configuration:
    exejpg

Apakah mungkin untuk mencapai apa yang saya inginkan dengan cara ini?


person user1039580    schedule 06.08.2012    source sumber
comment
Anda harus menerima jawaban yang paling sesuai dengan kebutuhan Anda.   -  person    schedule 09.08.2012


Jawaban (1)


Cara lain untuk mendapatkan hasil yang Anda inginkan.

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

Hasil:

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
Terima kasih atas tanggapannya. Saya memilih untuk tidak menggunakan xmlField.nodes() dan menggunakan xmlFields.query(...) karena saya memilih nilai dari kolom berbeda di tabel selain bidang XML, jadi saya ingin klausa FOR menjadi tabel itu sendiri. - person user1039580; 07.08.2012