Реферат: Использование XML совместно с SQL
<moderators>
<moderator name="Sinclair"/>
<moderator name="Hacker_Delphi"/>
</moderators>
<top-poster>Sinclair</top-poster>
</forum>
<forum name="DB" totalposts="6606" description="Базыданных">
<moderators>
<moderator name="_MarlboroMan_"/>
</moderators>
<top-poster>Merle</top-poster>
</forum>
</forums>
</rsdn>
Вот запрос, возвращающий общее количество сообщений для каждого форума:
exec sp_xml_preparedocument @hdoc out, @_xmlbody select [text] as totalposts from openxml(@hdoc,'/rsdn/forums/forum') as f join (select [id],localname \ from openxml(@hdoc,'/rsdn/forums/forum') where localname = 'totalposts') as d on d.[id] = f.parentid exec sp_xml_removedocument @hdoc |
Результатом его будет следующая таблица:
totalposts |
16688 |
10116 |
5001 |
6606 |
Не советую использовать подобный метод в рабочих проектах, и не только потому, что он неэффективен (как видно из примера, XML-документ сканируется дважды). Рассмотрим пример, выдающий тот же самый результат с использованием XPath.
exec sp_xml_preparedocument @hdoc out, @_xmlbody select * from openxml(@hdoc,'/rsdn/forums/forum') with(totalposts varchar(100) 'attribute::totalposts') exec sp_xml_removedocument @hdoc |