- XQuery em relação ao tipo de dados xml
- Casos de uso gerais de XQuery
- XQueries envolvendo hierarquia
-
XQueries envolvendo pedido
-
Qualquer coisa no blog de Michael Rys
Atualizar
Minha recomendação seria fragmentar o XML em relações e fazer buscas e junções na relação resultante, de forma orientada a conjuntos, ao invés da forma procedural de buscar nós específicos no XML. Aqui está uma consulta XML simples que destrói os nós e atributos de 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)
No entanto, se você precisar usar um XPath que recupere exatamente o valor de 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 o stepID e o ID do componente forem colunas, não variáveis, você deve usar sql:column() em vez de sql:variable nos filtros XPath. Consulte Ligação de dados relacionais dentro de dados XML .
E, finalmente, se tudo que você precisa é verificar a existência, você pode usar o 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"]')