Почему 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 в качестве его значения.