- XQuery tegen het XML-gegevenstype
- Algemene XQuery-gebruiksscenario's
- XQueries met hiërarchie
-
Alles in Michael Rys-blog
Bijwerken
Mijn aanbeveling zou zijn om de XML te versnipperen in relaties en zoekopdrachten en joins uit te voeren op de resulterende relatie, op een set-georiënteerde manier, in plaats van op de procedurele manier van het zoeken naar specifieke knooppunten in de XML. Hier is een eenvoudige XML-query die de knooppunten en kenmerken van belang vernietigt:
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)
Als u echter een XPath moet gebruiken die precies de gewenste waarde ophaalt:
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)
Als de stepID en component-ID kolommen zijn en geen variabelen, moet u sql:column() gebruiken in plaats van sql:variable in de XPath-filters. Zie Binding relationele gegevens in XML-gegevens .
En tot slot, als alles wat je nodig hebt om te controleren op bestaan is, kun je de exist( ) XML-methode:
select @x.exist(
N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled" and @valeur="Yes"]')