Wie man das Attribut nur mit xQuery abruft

Ich habe eine function, die dem Folgenden ähnlich ist, indem man großes Stück xml (in Produktionsumgebung) zurückgibt. In verschiedenen Stadien der Anwendung müssen wir nur einige der Elemente oder nur einige Attribute abrufen.

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 

Wie bekomme ich nur den Attributnamen namens 'Hades', 'Athena' mit xQuery so

 select (testrig.fxConfigurations(null).query('configurations/context[@name="apera"]/backends').query('/descendant-or-self::*')) 

Wenn du alle Werte der backend/@name Attribute (ala GROUP_CONCAT ) verketten GROUP_CONCAT :

 select testrig.fxConfigurations(null) .query('data(configurations/context[@name="apera"]/backends/backend/@name)') 

Wenn Sie mit den Attributen einzeln arbeiten müssen, müssen Sie möglicherweise nodes , um sie zu extrahieren:

 WITH cteXml AS ( SELECT testrig.fxConfigurations(null) .query('configurations/context[@name="apera"]') as context ) SELECT Nodes.node.value('@name', 'varchar(50)') AS backEndName FROM cteXml CROSS APPLY cteXml.context.nodes('//backends/backend') as Nodes(node); 

Geige hier