使用SQL Server 2008中的Openxml读取XML中的属性和元素

时间:2011-07-08 06:08:06

标签: xml sql-server-2008

我有如下所示的XML。我想使用openxml阅读XML属性和元素,请帮助我吗?

<Report>
     <Datapoints>
             <Datapoint>10</Datapoint>
             <Datapoint>11</Datapoint>
     </Datapoints>
<Filters>                 
        <Filter Id="5" FilterTypeId="4">            
            <Option2>21</Option2>
            <Option2>22</Option2>             
            <Option2>23</Option2>
        </Filter>        
        <Filter Id="6" FilterTypeId="4">            
            <Option2>21</Option2>
            <Option2>22</Option2>             
            <Option2>23</Option2>
        </Filter>   
    </Filters>           
</Report>

我想阅读标记FilterIdFilterTypeId)中的属性以及元素option2

1 个答案:

答案 0 :(得分:2)

为什么OPENXML ??看起来过于笨重且难以使用 - 在SQL Server中使用XPath / XQuery功能!

尝试这样的事情:

DECLARE @input XML = '<Report>
     <Datapoints>
             <Datapoint>10</Datapoint>
             <Datapoint>11</Datapoint>
     </Datapoints>
<Filters>                 
        <Filter Id="5" FilterTypeId="4">            
            <Option2>21</Option2>
            <Option2>22</Option2>             
            <Option2>23</Option2>
        </Filter>        
        <Filter Id="6" FilterTypeId="4">            
            <Option2>21</Option2>
            <Option2>22</Option2>             
            <Option2>23</Option2>
        </Filter>   
    </Filters>           
</Report>'
SELECT
    Filter.value('(@Id)[1]', 'int') AS 'FilterID',
    Filter.value('(@FilterTypeId)[1]', 'int') AS 'FilterTypeID',
    Opt2.value('(.)[1]', 'varchar(50)') AS 'Option2'
FROM 
    @input.nodes('/Report/Filters/Filter') AS Rep(Filter)
CROSS APPLY 
    Filter.nodes('Option2') AS Rep2(Opt2)

这应该给你一个类似的输出:

FilterID  FilterTypeID  Option2
   5            4          21
   5            4          22
   5            4          23
   6            4          21
   6            4          22
   6            4          23

基本上,首次使用.nodes()(别名为Rep(Filter))将创建所有<Filter> XML标记的“伪表”(每个XML标记一行)并且SELECT中的前两项是从每个<Filter> XML标记中获取属性。

然后,您需要在每个过滤器中包含所有<Option2>个元素的第二个枚举 - 这是第二个.nodes()调用正在执行的操作 - 基于第一个伪表中的过滤器XML标记。然后,它只输出XML标记的内容作为其值。