- XQuery contra el tipo de datos xml
- Casos generales de uso de XQuery
- XQueries que involucran jerarquía
-
Cualquier cosa en Blog de Michael Ry
Actualizar
Mi recomendación sería fragmentar el XML en relaciones y realizar búsquedas y uniones en la relación resultante, de forma orientada a conjuntos, en lugar de la forma procedimental de buscar nodos específicos en el XML. Aquí hay una consulta XML simple que fragmenta los nodos y atributos de interés:
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)
Sin embargo, si debe usar un XPath que recupere exactamente el valor de interés:
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)
Si el ID de paso y el ID de componente son columnas, no variables, debe usar sql:column() en lugar de sql:variable en los filtros XPath. Consulte Enlace de datos relacionales dentro de datos XML .
Y finalmente, si todo lo que necesita es verificar la existencia, puede usar exist( ) Método XML:
select @x.exist(
N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled" and @valeur="Yes"]')