2012-08-06 54 views
1

我在SQL Server 2008R2的表中有一个XML列。 的XML看起来像这样(简化的示例):XQuery - 将节点作为包含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 /节点() 1]串接在节点的所有内部元素的文本,而不保持XML标签,这样的结果我得到的是这样的:

Filter Type: a 
Configuration: 
    bla bla blakuku 

Filter Type: b 
Configuration: 
    Cookie 

Filter Type: c 
Configuration: 
    exejpg 

是否有可能实现什么,我想用这种方式?

+0

你应该接受的答案最能满足您的需求。 – 2012-08-08 20:47:09

+0

没有.. – user1039580 2012-08-21 06:59:40

回答

0

另一种获得所需结果的方法。

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

+1'F.N.query('*')' – 2012-08-06 17:09:32

+0

感谢您的回复。 我选择不使用xmlField.nodes()并使用xmlFields.query(...),因为我从XML字段以外的表中选择不同列中的值,所以我希望将FOR子句作为表本身。 – user1039580 2012-08-07 11:03:09

相关问题