ฉันมีคอลัมน์ 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 := " "
let $space := " "
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
เป็นไปได้ไหมที่จะบรรลุสิ่งที่ฉันต้องการด้วยวิธีนี้?