У меня есть функция, аналогичная следующей, возвращающая большой кусок xml (в производственной среде). На разных этапах приложения нам нужно извлечь из этого только некоторые элементы или только некоторые атрибуты.
create function testrig.fxConfigurations(@context varchar(300)) returns xml as
begin
return (select
'<configurations realm="configuration">
<context name="apera">
<backends>
<backend name="Hades">
<os>HP Unix</os>
<ip>nnn.nnn.nnn</ip>
<db vender="Oracle" version="11g">
<netconnect>Data Source= (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = hades)(PORT = 1521)(RECV_BUF_SIZE=1048576))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = baan)));Password=********;User ID=ItsMe;" providerName="Oracle.DataAccess.Client"
</netconnect>
</db>
</backend>
<backend name="Athena">
<os>HP Unix</os>
<ip>nnn.nnn.nnn</ip>
<db vender="Oracle" version="11g">
<netconnect>Data Source= (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = hades)(PORT = 1521)(RECV_BUF_SIZE=1048576))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = baan)));Password=********;User ID=ItsMe;" providerName="Oracle.DataAccess.Client"
</netconnect>
</db>
</backend>
</backends>
</context>
</configurations>
')
end
go
Как получить только имя атрибута, то есть «Аид», «Афина», используя xQuery, подобный этому
select (testrig.fxConfigurations(null).query('configurations/context[@name="apera"]/backends').query('/descendant-or-self::*'))