измельчение столбца XML - PullRequest
       7

измельчение столбца XML

0 голосов
/ 19 апреля 2010

У меня есть столбец XML, который содержит XML вроде этого:

<Set>
    <Element>
        <ID>
            1
        </ID>
<List>
    <ListElement>
        <Part1>
            ListElement 1
        </Part1>
    </ListElement>
    <ListElement>
        <Part1>
            ListElement2
        </Part1>
    </ListElement>
</List>
    </Element>
    <Element>
        <ID>
            2
        </ID>
<List>
    <ListElement>
        <Part1>
            ListElement3
        </Part1>
    </ListElement>
    <ListElement>
        <Part1>
            ListElement4
        </Part1>
    </ListElement>
</List>
    </Element>
</Set>

Я хотел бы разбить это на таблицу отношений, содержащую это:

ID, ListElement
1, ListElement1
1, ListElement2
2, ListElement3
2, ListElement4

Я могу получить содержимое частей, используя что-то вроде этого:

select      
    List.value('(Part1/text())[1]', 'varchar(max)') as test
from 
    Table CROSS APPLY 
      xml.nodes('// Element/List/ListElement') AS List(List)

но я еще не достиг «внешнего ключа» (значения идентификатора).

Спасибо.

С наилучшими пожеланиями,

Christian

Ответы [ 2 ]

0 голосов
/ 21 апреля 2010

На случай, если кто-нибудь захочет сделать это с XQuery:


<Table>
   {for $listElement in $table//ListElement
    return
      <Row>
        {$listElement/../../ID}
        {$listElement/Part1}
      </Row>    
   }
</Table>

где $ table - исходный XML

возвращает

<Table>
    <Row>
        <ID> 1 </ID>
        <Part1> ListElement 1 </Part1>
    </Row>
    <Row>
        <ID> 1 </ID>
        <Part1> ListElement2 </Part1>
    </Row>
    <Row>
        <ID> 2 </ID>
        <Part1> ListElement3 </Part1>
    </Row>
    <Row>
        <ID> 2 </ID>
        <Part1> ListElement4 </Part1>
    </Row>
</Table>
0 голосов
/ 19 апреля 2010

Попробуйте вместо запроса:

SELECT      
    List.value('(../../ID)[1]', 'int') AS 'ID',
    List.value('(Part1/text())[1]', 'varchar(max)') as test
FROM
    dbo.Table 
CROSS APPLY 
    xml.nodes('/Set/Element/List/ListElement') AS List(List)

Обновлено снова - теперь вернемся только к одному ПРИМЕНЕНИЮ КРОССА, вернувшись обратно к элементу "ID" великого родителя, используя ../../ID в XPath. Также исключено //Element XPath в пользу /Set/Element (//Element xpaths известны своей медлительностью)

...