Чтение атрибутов и элементов в XML с использованием Openxml в SQL Server 2008 - PullRequest
0 голосов
/ 08 июля 2011

У меня есть XML, показанный ниже. Я хочу прочитать атрибуты XML и элементы, используя openxml, не могли бы вы мне помочь?

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

Я хочу прочитать атрибуты в теге Filter (Id и FilterTypeId) вместе с элементом option2.

1 Ответ

2 голосов
/ 08 июля 2011

Почему OPENXML ??Кажется слишком громоздким и сложным в использовании - используйте возможности XPath / XQuery в SQL Server!

Попробуйте что-то вроде этого:

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 извлекают атрибуты из каждого из XML-тегов <Filter>.

Затем необходимо иметь второе перечисление всех элементов <Option2> внутри каждого фильтра - вот чтовыполняется второй .nodes() вызов - на основе тега XML фильтра из первой псевдотаблицы.Затем он просто выводит содержимое тега XML в качестве его значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...