- XQuery contro il tipo di dati xml
- Casi d'uso generali di XQuery
- XQueries che coinvolge la gerarchia
-
Qualsiasi cosa nel blog di Michael Rys
Aggiorna
La mia raccomandazione sarebbe quella di dividere l'XML in relazioni ed eseguire ricerche e join sulla relazione risultante, in modo orientato al set, piuttosto che in modo procedurale di ricerca di nodi specifici nell'XML. Ecco una semplice query XML che elimina i nodi e gli attributi di interesse:
select x.value(N'../../../../@stepId', N'int') as StepID
, x.value(N'../../@id', N'int') as ComponentID
, x.value(N'@nom',N'nvarchar(100)') as Nom
, x.value(N'@valeur', N'nvarchar(100)') as Valeur
from @x.nodes(N'/xml/box/components/component/variables/variable') t(x)
Tuttavia, se devi utilizzare un XPath che recuperi esattamente il valore di interesse:
select x.value(N'@valeur', N'nvarchar(100)') as Valeur
from @x.nodes(N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled"]') t(x)
Se lo stepID e l'ID componente sono colonne, non variabili, dovresti usare sql:column() invece di sql:variable nei filtri XPath. Vedere Associazione di dati relazionali all'interno di dati XML .
E infine, se tutto ciò di cui hai bisogno è verificarne l'esistenza, puoi utilizzare exist( ) Metodo XML:
select @x.exist(
N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled" and @valeur="Yes"]')